gpt4 book ai didi

Android 后退按钮导航到特定 fragment

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:04:34 27 4
gpt4 key购买 nike

我目前设置了抽屉导航菜单结构,以便在选择后退按钮时使用 addToBackStack 返回到之前的 fragmnet:

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

但是,我希望允许后退按钮始终将用户发送回特定 fragment ,而不仅仅是前一个 fragment 。

如何做到这一点?

修改

我尝试添加代码:

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)

当您提交 fragment 事务时,该方法会返回该事务的标识符。保存 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

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

这会将返回堆栈弹出,一直返回到提供的标识符。或者,如果您想在“弹出”ing 中包含 homeFragmentIdentifier,而不是 0,请使用 FragmentManager.POP_BACK_STACK_INCLUSIVE 作为第二个参数。您仍然必须调用 FragmentTransaction.addToBackStack()。根据文档:

public abstract int commit () ... Returns the identifier of this transaction's back stack entry, if addToBackStack(String) had been called. Otherwise, returns a negative number.

另外,如果你在将 fragment 添加到backstack时设置 fragment 的标签,例如:

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

您可以使用替代方法:FragmentManager.popBackStack(String, int)通过提供您在将交易添加到后台堆栈时使用的标签。

getFragmentManager().popBackStack("[YourFragmentTransactionTag]", 0); 

关于Android 后退按钮导航到特定 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34803872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com