假设我有一个以编程方式添加片段的活动:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

返回前一个可见片段的最佳方法是什么?

我发现Android中按钮点击的触发后退按钮功能,但我认为模拟后退键事件不是正确的方法(我也不能让它工作):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

调用finish()只是关闭我不感兴趣的活动。

还有更好的办法吗?


当前回答

我来到这里寻找或相同的想法,同时我提出了自己的,我相信不是那么糟糕,如果与ViewPager工作。

所以我所做的,是在持有viewPager的父活动中重写onBackPressed方法,并设置它总是回到负1的位置,直到它到达第一个片段,然后关闭活动。

@Override
public void onBackPressed() {
    if(viewPager.getCurrentItem()>0){
        viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
    } else {
        super.onBackPressed();
        this.close();
    }
}

private void close(){
    this.finish();
}

这可能会有一个下降,就像它每次只回到左边的一个方向,所以它可能不会工作得很好,如果有制表符,你切换位置与片段跳过,(从0到2,然后按回会把你放在1,而不是0)

对于我的情况,2个片段在viewPager没有标签,它的工作很好。

其他回答

这些答案不工作,如果我没有addToBackStack()添加到我的片段事务,但是,你可以使用:

getActivity().onBackPressed();

从你的任何一个片段往回走一步;

查看getFragmentManager().popBackStack()方法(有几个可供选择)

http://developer.android.com/reference/android/app/FragmentManager.html popBackStack ()

使用下面的代码以编程方式返回到前面的片段。

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();

将这些行添加到onBackPressed()方法中。popBackStackImmediate()方法会让你回到之前的片段,如果你有任何片段在后面的堆栈 `

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}

`

遵循Kotlin代码对我有用

1. 在简单活动类中添加了多个片段

override fun onBackPressed() {
    if (supportFragmentManager.backStackEntryCount > 0) {
        Log.i(TAG, "=============onBackPressed - Popping backstack====")
        supportFragmentManager.popBackStack()
    } else {
        Log.i(TAG, "=============onBackPressed called because nothing on backstack====")
        super.onBackPressed()
    }
}

2. 在使用了多个片段的BottomNavigationView Activity类中添加

override fun onBackPressed() {

    Log.e(TAG, "=============onBackPressed")
    val navController = findNavController(R.id.nav_host_fragment)
    when (navController.currentDestination!!.id) {
        R.id.navigation_comments, R.id.navigation_my_posts -> {
            menuItemPosition = 0
            navController.navigate(R.id.navigation_home)
            Log.i(TAG, "=============onBackPressed - Popping backstack with First fragment ====")
        }
        else -> {
            Log.i(TAG, "=============onBackPressed called because nothing on backstack====")
            super.onBackPressed()
        }
    }
}