Android 如何使用导航抽屉正确替换片段

Android 如何使用导航抽屉正确替换片段,android,android-fragments,navigation-drawer,Android,Android Fragments,Navigation Drawer,我使用的是导航抽屉,使用起来很简单。我不是提供完整的代码,而是为您提供细节,您可以很容易理解我的问题。我使用的片段大约有8个,我用一个替换另一个。但问题来了 我将在导航抽屉的单击事件中替换它们。但有两个主要问题 替换后,我可以在背景中看到前面的片段。replace方法是否只调用它上面的新片段?如果是,那么我应该如何处理在我的新片段的背景中看不到的旧片段 当我单击导航抽屉项时,它会成功加载特定片段。但是当我再次点击那个特定的项目时,它会一次又一次地加载这个片段。例如,若抽屉项num 3打开片段My

我使用的是导航抽屉,使用起来很简单。我不是提供完整的代码,而是为您提供细节,您可以很容易理解我的问题。我使用的片段大约有8个,我用一个替换另一个。但问题来了 我将在导航抽屉的单击事件中替换它们。但有两个主要问题

  • 替换后,我可以在背景中看到前面的片段。replace方法是否只调用它上面的新片段?如果是,那么我应该如何处理在我的新片段的背景中看不到的旧片段

  • 当我单击导航抽屉项时,它会成功加载特定片段。但是当我再次点击那个特定的项目时,它会一次又一次地加载这个片段。例如,若抽屉项num 3打开片段MyBook,那个么点击项num 3 2次或多次就会打开片段那个么长的时间

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

    使用FragmentTransaction的替换方法代替add()

    为了避免重新实例化片段,请跟踪当前打开的片段,并且仅在下一个打开的片段与当前片段不同时执行片段事务。 这可以通过以下方式实现:

    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。对于这些场景,需要扩展有关保留片段的信息(例如,存储引用或片段实例本身)。

    我这样尝试过。我觉得很好

        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();
    

    您可以在FragmentStration object.like中使用addtobackstack

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

    是的,我正在替换,正如我在上面的声明中清楚地说的那样。显示我可以跟踪它吗?它中的当前片段是什么?但是我如何跟踪不打开它在frgTransaction.setTransition(FragmentTransaction.TRANSIT\u fragment\u FADE)上给出错误的同一片段的多个实例;它说必须是其中之一,fragmentTransaction,open,close,none,当我将其切换为none或open或close时,错误在没有该行的情况下消失并检查,是片段调用还是notbackstack对我没有帮助
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.bodyfragment, new AnotherFragment()); 
    transaction.addtoBackStack(null).commit();