Android后退按钮导航到特定片段
我具有当前设置的导航抽屉菜单结构,当使用以下方式选择后退按钮时,可以使用addToBackStack返回上一个fragmnet:
I have the navigation drawer menu structure presently setup to allow for going back to the previous fragmnet, with addToBackStack, when selecting the back button as:
if (menuItem.getItemId() == R.id.nav_item_messages) {
FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).addToBackStack("MainActivity").commit();
}
但是,我希望允许后退按钮始终将用户发送回特定的片段,而不仅仅是前一个片段.
However, I wish to allow for the back button to always send the user back to a specific framgment, not simply the previous one.
这如何完成?
已修改
我尝试添加代码:
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)
在提交片段事务时,该方法将返回该事务的标识符.保存该 int
标识符:
When you commit your fragment transaction, the method returns an identifier for that transaction. Save that int
identifier:
FragmentTransaction xfragmentTransaction = getFragmentManager().beingTransaction();
xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment());
xfragmentTransaction.addToBackStack("MainActivity");
int homeFragmentIdentifier = transaction.commit();
然后,在您的 onBackPressed()
方法中,可以添加以下任一行:
then, in your onBackPressed()
method, you can add either of the following lines:
getFragmentManager().popBackStack(homeFragmentIdentifier, 0); // Exclusive
或
getFragmentManager().popBackStack("MainActivity", 0); // Exclusive
这将把堆栈一直弹出回到提供的标识符.或者,如果要在弹出"中包含 homeFragmentIdentifier
,请使用 FragmentManager.POP_BACK_STACK_INCLUSIVE
代替 0
作为第二个参数.您仍然必须调用 FragmentTransaction.addToBackStack()
.根据文档:
This will pop the back stack all the way back to the supplied identifier. Alternatively, if you want to include the homeFragmentIdentifier
in the "pop"ing, instead of 0
use FragmentManager.POP_BACK_STACK_INCLUSIVE
for the 2nd parameter.
You still must call FragmentTransaction.addToBackStack()
. According to the docs:
公共抽象int commit()...如果已调用addToBackStack(String),则返回此事务的后退堆栈条目的标识符.否则,返回负数.
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.
此外,如果您在将片段添加到后台时设置了片段的标签,例如:
Also, if you set the tag of the fragment when adding it to the backstack, for example:
transaction.add(yourFragment);
transaction.addToBackStack("[YourFragmentTransactionTag]");
您可以使用替代方法: FragmentManager.popBackStack(String,int)通过提供将事务添加到Backstack时使用的标记.
You can use the alternate method: FragmentManager.popBackStack(String, int) by supplying the tag you used when adding the transaction to the backstack.
getFragmentManager().popBackStack("[YourFragmentTransactionTag]", 0);