Sau*_*ron 11 android android-fragments
我现在设置了导航抽屉菜单结构,以便在选择后退按钮时,使用addToBackStack返回到上一个fragmnet:
if (menuItem.getItemId() == R.id.nav_item_messages) {
FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).addToBackStack("MainActivity").commit();
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望允许后退按钮始终将用户发送回特定的framgment,而不仅仅是前一个.
如何实现这一目标?
修订
我尝试添加代码:
int homeFragmentIdentifier = -1;
Run Code Online (Sandbox Code Playgroud)
...
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();
}
}
Run Code Online (Sandbox Code Playgroud)
...
@Override
public void onBackPressed() {
super.onBackPressed();
getFragmentManager().popBackStack(homeFragmentIdentifier, 0);
}
Run Code Online (Sandbox Code Playgroud)
但它只是调用错误:
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)
Run Code Online (Sandbox Code Playgroud)
And*_*ner 10
看看这个: FragmentManager.popBackStack(int,int)
提交片段事务时,该方法返回该事务的标识符.保存该int标识符:
FragmentTransaction xfragmentTransaction = getFragmentManager().beingTransaction();
xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment());
xfragmentTransaction.addToBackStack("MainActivity");
int homeFragmentIdentifier = transaction.commit();
Run Code Online (Sandbox Code Playgroud)
然后,在您的onBackPressed()方法中,您可以添加以下任一行:
getFragmentManager().popBackStack(homeFragmentIdentifier, 0); // Exclusive
Run Code Online (Sandbox Code Playgroud)
要么
getFragmentManager().popBackStack("MainActivity", 0); // Exclusive
Run Code Online (Sandbox Code Playgroud)
这会将后端堆栈一直弹回到提供的标识符.另外,如果你想包括homeFragmentIdentifier在"流行" ING,而不是0使用FragmentManager.POP_BACK_STACK_INCLUSIVE的第二个参数.你仍然必须打电话FragmentTransaction.addToBackStack().根据文件:
public abstract int commit()...如果调用了addToBackStack(String),则返回此事务的后栈条目的标识符.否则,返回负数.
此外,如果在将片段添加到backstack时设置片段的标记,例如:
transaction.add(yourFragment);
transaction.addToBackStack("[YourFragmentTransactionTag]");
Run Code Online (Sandbox Code Playgroud)
您可以使用备用方法:FragmentManager.popBackStack(String,int),方法是提供将事务添加到Backstack时使用的标记.
getFragmentManager().popBackStack("[YourFragmentTransactionTag]", 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11650 次 |
| 最近记录: |