在我的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);
}
答案 0 :(得分:0)
我找到的最佳解决方案如下:
onSavedInstanceState():当活动要关闭时(从一个活动到另一个活动或配置更改),始终在内部片段中调用。因此,如果我们在同一活动上调用多个片段,那么我们必须使用以下方法:
使用片段的OnDestroyView()并将整个对象保存在该方法中。然后OnActivityCreated():检查对象是否为null(因为此方法每次都调用)。现在恢复对象的状态。
它的作品总是!
要正确保存Fragment的实例状态,您应该执行以下操作:
在片段中,通过覆盖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
}
重要的是,在活动中,您必须将片段的实例保存在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);
}
希望这有帮助。
答案 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
}
}