オリエンテーションの変更に関するフラグメントの状態を維持しているAndroidの迷惑なタスクにアクセスしました。オリエンテーションの変更に関する複数のフラグメント
まず最初に、私はStackOverフローですべてのソリューションを試してみましたが、私は尋ねなかった良い結果しか持っていませんでした。
オリエンテーションの変更でフラグメントの変更を維持できましたが、ユーザーがフラグメントを切り替えたときにフラグメントの状態を保存できませんでした。このため、このソリューションを削除して新しいものを探しました。
私のアイデアは、断片を少しだけ隠してもう見えなくても、断片をもう一度作り直すことがないので、フラグメントを全体的に置き換える必要はなく、表示/非表示することです。
less talk、more Code。
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
によって「材質引き出し」ライブラリを使用しています、ナビゲーション引き出しにクリックを処理します。
コードが示すように、私はViewPager
,Browser
、およびSettings
の3つのフラグメントを持っています。
ここで私の問題は、オリエンテーションと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のコード:その後、ソリューションをしようとして4日後、私は座って、素敵な飲み物を持っていたので、
@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();
}
}