【问题标题】:Android save Fragments into Navigation DrawerAndroid将片段保存到导航抽屉中
【发布时间】:2017-07-01 16:01:27
【问题描述】:

在我的程序中,我有一些片段,我可以通过单击此代码来替换每个片段。我的问题是:这些片段的加载量很低,单击每个片段后,会从中创建新片段,并在单击片段后再次导致加载。如何保存片段内容或状态并防止重新加载?

@Override
    public void onNavigationDrawerItemSelected(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new InfoFragment();
                break;
            case 1:
                fragment = new ParentOtoFragment();
                break;
            case 2:
                fragment = new ParentProFragment();
                break;
            case 3:
                fragment = new SupportFragment();
                break;
            case 4:
                fragment = new AboutFragment();
                break;
        }
        if (fragment != null){
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container,fragment).commit();
        }
    }

发布更新

@Vikram Ezhil 回复此主题后,我将 fragmentsfragmentTAG 缩写为构造函数并将 @Vikram Ezhil 代码更改为以下代码,我的问题解决了。

@Override
   public void onNavigationDrawerItemSelected(int position) {
       FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
       fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

       if (getSupportFragmentManager().findFragmentByTag(fragmentTAGS[position]) == null) {
           fragmentTransaction.add(R.id.container, fragments[position], fragmentTAGS[position]);
       }
       for (int i = 0; i < fragments.length; i++) {
           if (i == position) {
               fragmentTransaction.show(fragments[i]);
           } else {
               if (getSupportFragmentManager().findFragmentByTag(fragmentTAGS[position]) != null) {
                   fragmentTransaction.hide(fragments[i]);
               }
           }
       }
       fragmentTransaction.commit();
   }

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    为了防止每次您从导航抽屉中单击项目时从头开始重新创建片段,您需要使用

    fragmentTransaction.add(R.id.container,fragment).commit();
    

    而不是

    fragmentTransaction.replace(R.id.container,fragment).commit();
    

    但是,当您添加片段而不是替换片段时,需要做一些额外的工作。

    1. 您需要确保不会多次添加相同的片段。您可以放置​​一个片段 TAG,并在添加片段之前检查该 TAG 是否存在。例如,

      if (getFragmentManager().findFragmentByTag("fragment1_tag") == null)
      {
          fragmentTransaction.add(R.id.container, fragment1, "fragment1_tag");
      }
      
    2. 您需要隐藏未显示的片段,因为当您开始添加片段时,它们会在屏幕上相互重叠。

      if (getFragmentManager().findFragmentByTag("fragment1_tag") != null)
      {
          fragmentTransaction.hide(fragment1);
      }
      
    3. 只要您想更新片段中的特定部分,请使用接口方法。我不会深入探讨这个,因为这是一个完全不同的话题。

    4. 确保应用程序被 android 操作系统终止后不会重叠,以便为其他应用程序分配内存 (check out this post for more info)。

    还添加了一些建议 - 从您上面的代码中,您只有一个片段变量,并将其重新用于所有 5 个屏幕。我建议您为 5 个屏幕设置单独的片段变量并将其保存为数组。

    原因是当您开始添加、隐藏、显示片段时,这将更容易控制和更通用。例如,

    InfoFragment fragment1 = new InfoFragment();
    ParentOtoFragment fragment2 = new ParentOtoFragment();
    ParentProFragment fragment3 = new ParentProFragment();
    SupportFragment fragment4 = new SupportFragment();
    AboutFragment fragment5 = new AboutFragment();
    
    Fragment[] fragments = new Fragment[]{fragment1,fragment2,fragment3,fragment4,fragment5};
    String[] fragmentTAGS = new String[]{"fragment1_tag","fragment2_tag","fragment3_tag","fragment4_tag","fragment5_tag"};
    

    现在使用上述方法,您可以根据从导航抽屉中单击的项目在片段之间切换。

    @Override
    public void onNavigationDrawerItemSelected(int position) 
    {
          // Add the fragments only once if array haven't fragment
          if (getFragmentManager().findFragmentByTag(fragmentTAGS[position]) == null)
          {
              fragmentTransaction.add(R.id.container,fragments[position],fragmentTAGS[position]);
          };
    
          // Hiding & Showing fragments
          for(int catx=0;catx<fragments.length;catx++)
          {
             if(catx == position)
             {
                  fragmentTransaction.show(fragments[catx]);
             }
             else
             {
                  // Check if the fragment is added and then hide it
                  if (getFragmentManager().findFragmentByTag(fragmentTAGS[catx]) != null)
                  {
                      fragmentTransaction.hide(fragments[catx]);
                  };
             };
          };
    
          fragmentTransaction.commit();
    };
    

    【讨论】:

      【解决方案2】:

      根据之前的回答,我开发了以下解决方案,希望对某人有所帮助:

      1.声明一个包含所有片段的数组:

      private Fragment[] fragments = new Fragment[] { new frag1(), new frag2()};
      

      2.onNavigationItemSelected触发事件时:

              Fragment fragment = null;
              switch (itemId) {
                  case R.id.nav_frag1:
                      fragment = fragments[0];
                      break;
                  case R.id.nav_frag2:
                      fragment = fragments[1];
                      break;
                  default:
                      return;
              }
      
              FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
              ft.replace(R.id.content_main, fragment);
              ft.commit();
      

      【讨论】:

        猜你喜欢
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多