Используйте backstack с ViewPager
-
13-12-2019 - |
Вопрос
Я использую ViewPager для реализации прокрутки в моем приложении для Android.Однако я бы хотел, чтобы предыдущий фрагмент отображался, когда пользователь использует кнопку "Назад" вместо завершения действия.Есть ли какой-нибудь способ сделать это?Спасибо Себастьян
Решение
Переопределить функциональность вашего Activity
:
public class Activity extends Activity
{
@Override
public void onBackPressed()
{
// do stuff
myFragment.onBackPressed();
}
}
public class Fragment extends Fragment
{
public void onBackPressed()
{
// do stuff
}
}
Другие советы
У меня была похожая проблема, вот как я ее решил.У меня был ViewPager с 6 фрагментами и хотел отслеживать историю страницы и иметь возможность использовать кнопку «Назад», чтобы навигаться назад в истории.Я создаю объект java.util.Stack<Integer>
, добавляйте его в него.
Вы хотите избежать толкания элементов в стеке, когда вы нажимаете кнопку «Назад», в противном случае вы будете застревать между двумя фрагментами, если вы продолжаете использовать кнопку «Назад», а не в конечном итоге.
Мой код:
MyAdapter mAdapter;
ViewPager mPager;
Stack<Integer> pageHistory;
int currentPage;
boolean saveToHistory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.container);
mPager.setAdapter(mAdapter);
mPager.setOffscreenPageLimit(5);
pageHistory = new Stack<Integer>();
mPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
if(saveToHistory)
pageHistory.push(Integer.valueOf(currentPage));
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
saveToHistory = true;
}
@Override
public void onBackPressed() {
if(pageHistory.empty())
super.onBackPressed();
else {
saveToHistory = false;
mPager.setCurrentItem(pageHistory.pop().intValue());
saveToHistory = true;
}
};
. Переопределение ниже метода в действии фрагмента должна решить вашу проблему.
@Override
public void onBackPressed() {
if (mViewPager.getCurrentItem() == 0) {
// If the user is currently looking at the first step, allow the system to handle the
// Back button. This calls finish() on this activity and pops the back stack.
super.onBackPressed();
} else {
// Otherwise, select the previous step.
mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1);
}
}
. У меня есть те же проблема, и я следую за этим шагом ( отредактировал мой ответ - конечно, работаю для меня, дайте ему попробовать )
в основной активности, где есть 3 фрагмента в ViewPager, я создаю стек и push и pop данные.
private Stack<Integer> stackkk;
private ViewPager mPager;
private int tabPosition = 0;
mTabLayout.setupWithViewPager(mPager);
mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
tabPosition = tab.getPosition();
mPager.setCurrentItem(tab.getPosition());
// here i have add the data into the stack in each tab click, as at first it will always be null so i add 0 position
if (stackkk.empty())
stackkk.push(0);
if (stackkk.contains(tabPosition)) {
stackkk.remove(stackkk.indexOf(tabPosition));
stackkk.push(tabPosition);
} else {
stackkk.push(tabPosition);
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tabPositionUnselected = tab.getPosition();
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
.
и в обратной стороне в активности,
//OnbackPress i have first taken out the last one as it already and
//selected by poping it out then only set to the pager.
@Override
public void onBackPressed() {
if (stackkk.size() > 1) {
stackkk.pop();
mPager.setCurrentItem(stackkk.lastElement());
} else {
}
}
.
Надеюсь, это может помочь или msg me.