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

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()只是关闭我不感兴趣的活动。

还有更好的办法吗?


当前回答

为了详细说明提供的其他答案,这是我的解决方案(放在一个活动中):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

其他回答

芬兰湾的科特林回答

首先,调用片段管理器。 之后,使用onBackPressed() 方法。

使用Kotlin在Android Studio 4.0中编码:

fragmentManager?.popBackStack()

遵循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()
        }
    }
}
getActivity().getSupportFragmentManager().popBackStackImmediate();

OR

 getActivity().onBackPressed();

当你想关闭应用程序时,当你在主片段中向后按下时,这个解决方案非常适合基于底部栏的片段导航。

另一方面,当你打开二级片段(片段中的片段),在我的代码中定义为“DetailedPizza”,它将返回主片段的先前状态。干杯!

内部活动的背面按下放这个:

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

if (home instanceof FragmentDetailedPizza && home.isVisible()) {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
} else {
    //Primary fragment
    moveTaskToBack(true);
}

然后像这样启动另一个片段:

Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();

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

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

`