加载后不要重新加载片段-ANDROID

时间:2016-06-20 06:07:50

标签: android android-fragments

在我的Android应用中,我有6个片段,在导航抽屉中单击项目时逐个替换。我的问题是,当单击导航抽屉项目时,片段会一次又一次地加载。我不希望我的片段一次又一次地重新加载。相反,我希望它们在从片段切换到片段时保持其先前的状态。 Addbacktostack()无效。请告诉我一些其他方法:

我的代码是:

 @Override
public void onDrawerItemSelected(View view, int position) {
    row_view = view;
    displayView(position);

}

private void displayView(int position) {
    Fragment fragment = null;
    String title = getString(R.string.app_name);
    switch (position) {
        case 0:
            fragment = new Fragmenta();
            title = "aaaa";
            toolbar_title.setText(title);
            break;
        case 1:
            fragment = new Fragmentb();
            title = "Introduction";
            toolbar_title.setText(title);
            break;
        case 2:
            fragment = new Glossary();
            title = "Glossary";
            toolbar_title.setText(title);
            break;
        case 3:
            fragment = new SettingsFragment();
            title = "Settings";
            toolbar_title.setText(title);
            break;
        case 4:
            fragment = new FeedbackFragment();
            title = "Feedback";
            toolbar_title.setText(title);
            break;
        case 5:
            fragment = new Fragmentc();
            title = "cc";
            toolbar_title.setText(title);
            break;

        default:
            break;
    }



if (myfragmentstate != null) {             // This is always null
        //Restore the fragment's instance
        fragment = getSupportFragmentManager().getFragment(myfragmentstate, "mContent");
        Log.i("sadfas","fragment"+fragment);

    }
    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(R.id.container_body,fragment);   //always reloads a fragment and i donot want this
        fragmentTransaction.commit();
        toolbar_title.setText(title);

    }
}



@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.i("MicroRAE","instanmce save"+fragment);
    getSupportFragmentManager().putFragment(outState, "mContent", fragment);
}

3 个答案:

答案 0 :(得分:0)

我找到的最佳解决方案如下:

onSavedInstanceState():当活动要关闭时(从一个活动到另一个活动或配置更改),始终在内部片段中调用。因此,如果我们在同一活动上调用多个片段,那么我们必须使用以下方法:

使用片段的OnDestroyView()并将整个对象保存在该方法中。然后OnActivityCreated():检查对象是否为null(因为此方法每次都调用)。现在恢复对象的状态。

它的作品总是!

要正确保存Fragment的实例状态,您应该执行以下操作:

  1. 在片段中,通过覆盖onSaveInstanceState()并在onActivityCreated()中恢复来保存实例状态:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
    if (savedInstanceState != null) {
        //Restore the fragment's state here
    }
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
    
    //Save the fragment's state here
    

    }

  2. 重要的是,在活动中,您必须将片段的实例保存在onSaveInstanceState()中并在onCreate()中恢复。

    public void onCreate(Bundle savedInstanceState) {
    ...
    if (savedInstanceState != null) {
        //Restore the fragment's instance
        mContent = getSupportFragmentManager().getFragment(savedInstanceState, "mContent");
    
    }
    
    }      
    @Override
        protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    
    //Save the fragment's instance
    getSupportFragmentManager().putFragment(outState, "mContent", mContent);
    }
    
  3. 希望这有帮助。

答案 1 :(得分:0)

我找到了一个非常好的解决方案:

String backStateName = fragment.getClass().getName();

    FragmentManager fragmentManager = getSupportFragmentManager();
    boolean fragmentPopped = fragmentManager.popBackStackImmediate (backStateName, 0);

    if (!fragmentPopped){ //fragment not in back stack, create it.
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(R.id.container_body,fragment);
        fragmentTransaction.addToBackStack(backStateName);
        fragmentTransaction.commit();
        toolbar_title.setText(title);
    }

答案 2 :(得分:0)

非常简单:只需声明一个全局字符串即可保存最后加载的片段。在加载片段的方法中,比较是否相同。如果没有,则加载新片段,如果匹配,则什么都不做。

     String lastFragmentLoaded = null; // THIS VARIABLE IS GLOBAL

        //YOUR METHOD THAT LOAD FRAGMENTS
        LoadMyFragment() 
   {
             String currentFragmentName = yourFragment.getClass().getName();

             if(lastFragmentLoaded != currentFragmentName) {
                   //LOAD YOUR FRAGMENTS

             //FINALLY, SAVE YOUR LAST FRAGMENT LOADED TO COMPARE NEXT TIME
             lastFragmentLoaded = currentFragmentName;
        }
        else 
        {
            // LET IT EMPTY IF YOU WANT
        }
   }