【问题标题】:How to replace fragment properly using navigation drawer如何使用导航抽屉正确替换片段
【发布时间】:2015-07-08 20:29:34
【问题描述】:

我正在使用导航抽屉,它使用起来很简单。我没有提供完整的代码,而是为您提供详细信息,以便您理解我的问题。我正在使用数量约为 8 个的片段,并且我正在将它们替换为另一个。但是问题来了 我在导航抽屉的点击事件中替换它们。但是有两个主要问题

  1. 替换后,我可以在后台看到之前的片段。替换方法只是调用新片段吗?如果是,那么我应该对新片段的背景中不可见的旧片段做什么。

  2. 当我点击导航抽屉项时,它会成功加载特定的片段。但是当我再次单击该特定项目时,它会保留该片段,它会一次又一次地加载该片段。例如,如果抽屉项目 num 3 打开片段 MyBook ,那么通过单击项目 num 3 2 或多次将打开片段那么多时间。

所以请有人回答我如何治愈我的应用程序,以应对我上面描述的这种行为。

【问题讨论】:

    标签: android android-fragments navigation-drawer


    【解决方案1】:

    我试过这样。它工作得很好我

        FragmentManager frgmanager = getFragmentManager();
        frgmanager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        FragmentTransaction frgTransaction = frgmanager.beginTransaction();
    
        if(subitem.equalsIgnoreCase("subitem")){
            Frag1 frg1 =new Frag1(mCtx);
            frgTransaction.replace(R.id.inflate_layout, frg1);
        }else if(subitem1.equalsIgnoreCase("subitem1")){
            Frag2 frg2 =new Frag2(mCtx);
            frgTransaction.replace(R.id.inflate_layout, frg2);
        }else{
            Frag2 frg3 =new Frag3(mCtx);
            frgTransaction.replace(R.id.inflate_layout, frg3);
        }
        frgTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        frgTransaction.commit();
    

    【讨论】:

    • 但是我怎样才能不打开同一个片段的多个实例
    • 在 frgTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 上给出错误;它说必须是其中之一,fragmentTransaction,open,close,none,当我将其切换为 none 或 open 或 close 时,错误消失
    • 尝试不使用该行并检查是否是 Fragment 调用
    【解决方案2】:

    你可以在fragmentstranstion object.like中使用addtobackstack

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.bodyfragment, new AnotherFragment()); 
    transaction.addtoBackStack(null).commit();
    

    【讨论】:

    • backstack 对我没有帮助
    【解决方案3】:

    使用 FragmentTransaction 的 replace 方法而不是 add (http://developer.android.com/guide/components/fragments.html#Transactions)

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.bodyfragment, new AnotherFragment()); 
    transaction.commit();
    

    为避免重新实例化片段,请跟踪当前打开的片段并仅执行片段事务,如果我们下一个要打开的片段与当前片段不同。 这可以实现如下:

    class MyActivity ... {
      private String currentFragment;
    
      private void openNewFragment(Fragment fragment) {
          String newFragment = fragment.getClass().getSimpleName();
    
          if (newFragment.equals(currentFragment)){
              // new fragment already shown
              return;
          }
          // Fragment transaction etc here:
      }
    }
    

    请注意,这只比较基于类名的片段。有时这可能不是唯一的,例如如果有一个 DetailFragment 类显示有关实体的信息。要显示哪些实体详细信息可能取决于意图参数。

    但是,如果当前显示 Entity=2 的详细信息,则上面的代码将阻止打开 Entity=1 的 DetailFragment。对于这些场景,需要扩展保存的片段信息(例如,将引用或WeakReference 存储到片段实例本身)。

    【讨论】:

    • 是的,我正在替换,正如我在上面的陈述中明确表示的那样
    • 如何跟踪它?
    • 其中的当前片段是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多