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

时间:2016-01-15 03:21:53

标签: 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();
        }

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

如何实现这一目标?

修正

我尝试添加代码:

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)

1 个答案:

答案 0 :(得分:8)

看看这个: FragmentManager.popBackStack(int, int)

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

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

  

public abstract int commit()...   如果已调用addToBackStack(String),则返回此事务的后栈条目的标识符。否则,返回一个负数。

此外,如果在将片段添加到backstack时设置片段的标记,例如:

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

您可以使用备用方法:FragmentManager.popBackStack(String, int),方法是提供将事务添加到Backstack时使用的标记。

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