使用BackStack与ViewPager

Seb*_*ian 8 android android-viewpager back-stack

我正在使用ViewPager在我的Android应用程序中实现滑动.但是,我想在用户使用后退按钮而不是结束活动时显示前一个片段.有没有办法做到这一点?谢谢塞巴斯蒂安

ref*_*tor 7

在 Fragment Activity 中覆盖以下方法应该可以解决您的问题。

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Dro*_*der 5

覆盖您的功能Activity

public class Activity extends Activity
{
    @Override
    public void onBackPressed()
    {
        // do stuff
        myFragment.onBackPressed();
    }
}

public class Fragment extends Fragment
{

    public void onBackPressed()
    {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)


Pie*_*lli 5

我遇到了类似的问题,这就是我解决它的方法.我有一个包含6个片段的ViewPager,想要跟踪页面历史记录,并能够使用后退按钮在历史记录中向后导航.我创建了一个java.util.Stack<Integer>对象,向它添加片段编号(除非你使用后退按钮,见下文),并覆盖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;
    }
};
Run Code Online (Sandbox Code Playgroud)