Android后退按钮导航到特定片段 [英] Android back button navigate to specific fragment

查看:74
本文介绍了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); 

这篇关于Android后退按钮导航到特定片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆