Use backstack with ViewPager

后端 未结 5 1453
栀梦
栀梦 2021-01-02 09:44

I am using a ViewPager to implement swiping in my android app. However, I would like the previous fragment to be shown when the user uses the back button instead of ending t

5条回答
  •  我在风中等你
    2021-01-02 10:02

    I had a similar problem, this is how I solved it. I had a ViewPager with 6 fragments and wanted to keep track of the page history and to be able to use the back button to navigate backwards in the history. I create a java.util.Stack object, add fragment numbers to it (except when you use the back button, see below), and override onBackPressed() to make it pop the last viewed fragment instead of using the back stack, when my history stack is not empty.

    You want to avoid pushing elements on the Stack when you press the back button, otherwise you will get stuck between two fragments if you keep using the back button, instead of eventually exiting.

    My code:

    MyAdapter mAdapter;
    ViewPager mPager;
    Stack 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();
        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;
        }
    };
    

提交回复
热议问题