Android将碎片保存到导航抽屉中

时间:2014-12-11 16:19:31

标签: android android-fragments

在我的程序中我有一些片段,我可以用这个代码点击它来替换每个片段。我的问题是:这些片段加载很少,点击每个片段后,从中创建新片段并在点击片段后再次加载。如何保存片段内容或状态并阻止重新加载?

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

POST UPDATE

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

2 个答案:

答案 0 :(得分:6)

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

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个屏幕重新使用它。我建议你为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();
    };
    

答案 1 :(得分:-1)

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

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

<form class="form-horizontal" method="post">
    <!-- ... -->
</form>

2.当 onNavigationItemSelected 触发事件时:

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