同时替换多个片段

时间:2017-11-15 13:02:09

标签: android android-fragments

我有一个带导航抽屉的Activity。我已经使用了片段,当我移动到抽屉中的不同菜单时,我使用addToBackStack()方法将它们添加到backstack。基本上,Activity片段A 开头,然后如果我转到片段B 片段C ,我可以按回去并返回片段A

但是现在我有一个通知应该打开Activity 片段B 打开,当我按回来时它应该带我回到片段A 。有没有办法像startActivities一样处理这个问题。

以下是Activity的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    getSupportFragmentManager().beginTransaction().replace(R.id.layoutContent, new FragmentA()).commit();
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.buttonA:
            getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

            break;

        case R.id.buttonB:
            transactFragment(new FragmentB());

            break;
        ...
     }
 }

private void transactFragment(Fragment fragment) {
    getSupportFragmentManager().beginTransaction().replace(R.id.layoutContent, fragment).addToBackStack(fragment.getClass().getName()).commit();
}

1 个答案:

答案 0 :(得分:1)

为什么不用标签定义片段并根据需要调用它们?

以下是我如何使用我的片段的示例:

使用Activity的{​​{1}}方法启动您的片段,如下所示:

onCreate()

然后你可以抓住它们并随意显示/隐藏它们:

/** Load screen1 */
    Instructions screen1 = new Instructions();
    screen1.setArguments(getIntent().getExtras());

    getFragmentManager().beginTransaction().
            add(com.example.tool.R.id.
                    instructions_container, screen1, "screen1").
            addToBackStack(null).
            commit();

在我的项目中,我们使用全局枚举来检查当前哪个片段,所以我们不必依赖堆栈,堆栈不止一次证明自己是不可靠的。

/** screen 1 */ public void showInstructions() { // show screen 1 getFragmentManager().findFragmentByTag("screen1"). getView().setVisibility(View.VISIBLE); } 调用一个开关,它会检查此枚举并相应地执行操作。对于您的用例,您可以跟踪何时调用此通知,因此它将从片段B转到片段A。