6 に答える
同じ問題が発生し、エラーメッセージの提案に従おうとしました。次のコードを試してみましたが、うまくいきました。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
if (mMyView == null) {
mMyView = new MyView(getActivity());
} else {
((ViewGroup) mMyView.getParent()).removeView(mMyView);
}
return mPuzzleView;
}
私は何時間も前にこれに対する簡単な解決策を探し始め、最終的に@rogerによる答えに出くわしました。
他の実装で ViewPager を使用する場合は、次のように簡単に呼び出すことができます。
mViewPager.setOffscreenPageLimit(//number of pages to cache);
ですから、これを解決するのに何時間もかかったことに非常に驚きました。ただし、彼が示した例は完全に明確ではなかったので、完全を期すために、FragmentTabHost のフラグメントに使用するコードを次に示します。
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentExample extends Fragment {
private View rootView;
public FragmentExample() {
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_example_layout, container, false);
// Initialise your layout here
} else {
((ViewGroup) rootView.getParent()).removeView(rootView);
}
return rootView;
}
}
私が今経験したフラストレーションから誰かを救うことができることを願って、ここに追加する次のキーフレーズを検索しました!
FragmentTabHost はフラグメントの状態を保存します
FragmentTabHost ビューの再作成
FragmentTabHostキャッシュフラグメント
FragmentTabHost onCreateView フラグメントが破棄されました
次の解決策は私にとってはうまくいきます。タブを切り替えるときに Fragment の onCreateView が呼び出されるのを防ぎます。
アクティビティの onCreate は、すべてのフラグメントを追加し、最初のタブのフラグメントを除くすべてを非表示にする必要があります。
ft.add(R.id.fragment_content, secondTabFragment);
ft.hide(secondTabFragment);
ft.add(R.id.fragment_content, firstTabFragment);
ft.show(firstTabFragment);
ft.commit();
currentFragment = firstTabFragment;
アクティビティの onTabSelected は、現在のフラグメントを非表示にし、選択したタブに対応するフラグメントを表示する必要があります。
ft.hide(currentFragment);
ft.show(chosenFragment);
ft.commit();
currentFragment = chosenFragment;
デバイスの向きを変更するとアクティビティが再起動され、フラグメントが再作成されることに注意してください。マニフェストに次の configChanges を追加することで、これを回避できます。
<activity android:configChanges="keyboardHidden|orientation" ...
View mMyView = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
if (state == null) {
mMyView = new MyView(getActivity());
} else {
container.removeView(mMyView);
}
return mMyView;
}
私は同じ問題に直面しましたが、ActionBar.TabListener のコールバック内でフラグメントをアタッチまたはデタッチする前に、呼び出しました。
fragmentManager.executePendingTransactions();
これは私にとって問題を解決します
@Override
public void onTabelected(Tab tab, FragmentTransaction ft, FragmentManager fm) {
fm.executePendingTransactions(); // **execute the pending transactions before adding another fragment.
if (mFragment == null) {
mFragment = Fragment.instantiate(mContext, mFragmentName);
ft.replace(android.R.id.tabcontent, mFragment, mTag);
} else {
ft.attach(mFragment);
}
}