Android 后退按钮导航到特定片段

2024-01-14

我目前设置了导航抽屉菜单结构,以允许在选择后退按钮时使用 addToBackStack 返回到上一个片段:

    if (menuItem.getItemId() == R.id.nav_item_messages) {
            FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
            xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).addToBackStack("MainActivity").commit();
        }

但是,我希望允许后退按钮始终将用户返回到特定片段,而不仅仅是前一个片段。

如何才能做到这一点?

amended

我尝试添加代码:

int homeFragmentIdentifier = -1;

...

            if (menuItem.getItemId() == R.id.nav_item_messages) {
                FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
                if(homeFragmentIdentifier == -1) {
                    homeFragmentIdentifier = xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).commit();
                } else {
                    xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).commit();
                }

            }

...

@Override
public void onBackPressed() {
    super.onBackPressed();

    getFragmentManager().popBackStack(homeFragmentIdentifier, 0);

}

但它只是调用错误:

01-15 19:31:55.368 18410-18410/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.example.android.feastappv2, PID: 18410
                                                   java.lang.IllegalArgumentException: Bad id: -1
                                                       at android.app.FragmentManagerImpl.popBackStack(FragmentManager.java:526)
                                                       at com.example.android.feastappv2.feastapp.MainActivity.onBackPressed(MainActivity.java:143)
                                                       at android.app.Activity.onKeyUp(Activity.java:2667)
                                                       at android.view.KeyEvent.dispatch(KeyEvent.java:3214)
                                                       at android.app.Activity.dispatchKeyEvent(Activity.java:2922)

看看这个:FragmentManager.popBackStack(int, int) http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack(int,%20int)

当您提交片段事务时,该方法会返回该事务的标识符。保存那个int标识符:

FragmentTransaction xfragmentTransaction = getFragmentManager().beingTransaction();
xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment());
xfragmentTransaction.addToBackStack("MainActivity");
int homeFragmentIdentifier = transaction.commit();

那么,在你的onBackPressed()方法,您可以添加以下任一行:

getFragmentManager().popBackStack(homeFragmentIdentifier, 0); // Exclusive

or

getFragmentManager().popBackStack("MainActivity", 0); // Exclusive

这会将返回堆栈一直弹出到提供的标识符。或者,如果您想包括homeFragmentIdentifier在“流行”中,而不是0 use FragmentManager.POP_BACK_STACK_INCLUSIVE对于第二个参数。 你还是必须打电话FragmentTransaction.addToBackStack()。根据文档:

公共抽象 int 提交 () ... 如果已调用 addToBackStack(String),则返回此事务的返回堆栈条目的标识符。否则,返回负数。

另外,如果你在将fragment添加到backstack时设置了tag,例如:

transaction.add(yourFragment);
transaction.addToBackStack("[YourFragmentTransactionTag]");

您可以使用替代方法:FragmentManager.popBackStack(String, int) http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack(String,%20int)通过提供您在将事务添加到后台堆栈时使用的标签。

getFragmentManager().popBackStack("[YourFragmentTransactionTag]", 0); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 后退按钮导航到特定片段 的相关文章

随机推荐