Использовать backstack с ViewPager

Я использую ViewPager для реализации swip в моем приложении 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> , добавляю к нему номера фрагментов (за исключением случаев, когда вы используете кнопку «Назад», см. Ниже) и переопределяете onBackPressed() чтобы заставить onBackPressed() последний просмотренный фрагмент вместо использования обратного стека , Когда мой стек истории не пуст.

Вы хотите избежать нажатия элементов в стеке, когда вы нажимаете кнопку «Назад», иначе вы будете застревать между двумя фрагментами, если будете продолжать использовать кнопку «Назад», а не выходить из нее.

Мой код:

 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; } }; 

У меня такая же проблема, и я следую этому шагу ( Отредактированный мой ответ — Конечно, работайте для меня, попробуйте )

В основной деятельности, где есть 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) { } }); } 

И в onBackPressed в деятельности,

 //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 { } } 

Надеюсь, это поможет мне или мне.