【发布时间】:2017-02-27 06:54:06
【问题描述】:
我在 Android 中遇到了一个烦人的任务,即在方向更改时维护片段的状态。
首先,我在 StackOver flow 上尝试了所有解决方案,但我只得到了一个我没有要求的好结果。
我能够维护 Fragment 中的更改,在 Orientation 更改时,但无法在用户切换 Fragment 时保存 Fragment 状态,因此我删除了此解决方案并寻找一个新的、更好的解决方案。
我的想法是显示/隐藏片段,而不需要整体替换它们,因为它们只会被隐藏一小段时间,如果它们不再可见,再次创建它们没有问题。
少说话,多写代码。
int mID = (int) drawerItem.getIdentifier();
String mTag = "";
switch (mID){
case 0:
mTag = "ViewPager";
break;
case 1:
mTag = "Browser";
break;
case 2:
mTag = "Settings";
break;
}
if (savedInstanceState == null) {
ShowHideFrags(mID);
} else {
switch (mID){
case 0:
Log.i("ASDSADSA","4");
mViewPager = (ViewPagerFragment) getSupportFragmentManager().findFragmentByTag(mTag);
ShowHideFrags(mID);
break;
case 1:
Log.i("ASDSADSA","5");
mWebFrag = (WVFragment) getSupportFragmentManager().findFragmentByTag(mTag);
ShowHideFrags(mID);
break;
case 2:
Log.i("ASDSADSA","6");
mSettings = (SettingsFragment) getSupportFragmentManager().findFragmentByTag(mTag);
ShowHideFrags(mID);
break;
}
}
此代码处理导航抽屉中的点击,我正在使用Mikepenz 的“Material Drawer”库。
如代码所示,我有三个片段,分别是ViewPager、Browser 和Settings。
我的问题是,它被重新创建,没有方向和getFragment 方法,代码中没有问题,但是当我添加对此更改的支持时,片段会再次重新创建。我已经尝试过多次更改代码,记录更改,看看有什么问题。
第一次启动时,它调用ShowHideFrags(int x)方法,然后转到else。
ShowHideFrags(int x) 的代码:
private void ShowHideFrags(int SelectedFrag){
if(mFragmentManager == null)
mFragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = mFragmentManager.beginTransaction();
switch (SelectedFrag){
case 0:
if(mViewPager == null)
mViewPager = new ViewPagerFragment();
if(!mViewPager.isAdded())
ft.add(R.id.fragment,mViewPager,"Viewpager");
if(!mViewPager.isVisible()){
if((mSettings != null && mSettings.isVisible()))
ft.hide(mSettings);
if((mWebFrag != null && mWebFrag.isVisible()))
ft.hide(mWebFrag);
ft.show(mViewPager);
} else {
if((mSettings != null && mSettings.isVisible()))
ft.hide(mSettings);
if((mWebFrag != null && mWebFrag.isVisible()))
ft.hide(mWebFrag);
}
ft.commit();
break;
case 1:
if(mWebFrag == null)
mWebFrag = new WVFragment();
if(!mWebFrag.isAdded())
ft.add(R.id.fragment,mWebFrag,"Browser");
if(!mWebFrag.isVisible()) {
if((mSettings != null && mSettings.isVisible()))
ft.hide(mSettings);
if(mViewPager != null && mViewPager.isVisible())
ft.hide(mViewPager);
ft.show(mWebFrag);
} else {
if((mSettings != null && mSettings.isVisible()))
ft.hide(mSettings);
if((mViewPager != null && mViewPager.isVisible()))
ft.hide(mViewPager);
}
ft.commit();
break;
case 2:
if(mSettings == null)
mSettings = new SettingsFragment();
if(!mSettings.isAdded())
ft.add(R.id.fragment,mSettings,"Settings");
if(!mSettings.isVisible()) {
if((mViewPager != null && mViewPager.isVisible()))
ft.hide(mViewPager);
if((mWebFrag != null && mWebFrag.isVisible()))
ft.hide(mWebFrag);
ft.show(mSettings);
} else {
if((mViewPager != null && mViewPager.isVisible()))
ft.hide(mViewPager);
if((mWebFrag != null && mWebFrag.isVisible()))
ft.hide(mWebFrag);
}
ft.commit();
break;
}
}
我的 onSaveInstanceState 的代码:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
try{
long mSelectedItem = result.getCurrentSelection();
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment);
getSupportFragmentManager().putFragment(outState,currentFragment.getTag(),currentFragment);
outState.putLong("SelectedItem",mSelectedItem);
} catch (Exception e){
e.printStackTrace();
}
}
【问题讨论】: