基本的にActionBarを備えたアプリを開発しています。アプリが起動すると、アクティビティがフラグメントを作成して各タブに添付するため、切り替えると異なるビューが表示されます。
デバイスを回転させようとすると問題が発生します。苦労した後、Androidは、以前に追加したフラグメントを次のように自動的に再作成することに気付きました。
SummaryFragment.onCreate(Bundle) line: 79
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032
FragmentManagerImpl.moveToState(int, boolean) line: 1014
FragmentManagerImpl.dispatchCreate() line: 1761
DashboardActivity(Activity).onCreate(Bundle) line: 864
...
その後、通常どおりフラグメントを再作成します。そのため、正しく機能することが期待される「実際の」フラグメントと、アプリをクラッシュさせる「隠された」Androidで作成されたフラグメントがあります。この動作を回避するにはどうすればよいですか? SummaryFragmentでsetRetainInstance(false)を呼び出そうとしました。
ありがとうございました
SavedInstanceState [編集:親アクティビティ内]を確認する必要があります。存在する場合は、フラグメントを作成しないでください。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (savedInstanceState == null) {
// Do your oncreate stuff because there is no bundle
}
// Do stuff that needs to be done even if there is a saved instance, or do nothing
}
より良い解決策があるかどうかはわかりませんが、これは私が最新のプログラムで行ったことです。
方向の変更時にシステムによってフラグメントが自動的に作成され、ホストアクティビティでフラグメントを追跡する場合は、ホストアクティビティのOnAttachFragment()
メソッドでフラグメントをキャッチします。そして、それらはデフォルトで引数を取得するので、それらを使用してそれがどのフラグメントであるかを見つけることができます。
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment != null) {
if(fragment.getArguments() != null) {
switch (fragment.getArguments().getString(ARG_PARAM1)) {
case FragmentATag:
if (myFragmentA != fragment) {
myFragmentA = (FragmentA) fragment;
}
break;
case FragmentBTag:
if (myFragmentB != fragment) {
myFragmentB = (FragmentB) fragment;
}
break;
}
}
}
}
両方の方向に同様のUI(特定のレイアウトランドファイルがない)がある場合は、マニフェストファイルのアクティビティにAndroid:configChanges="keyboardHidden|orientation"
を設定できます。
提供されない場合は、フラグメントをタブに追加するソースコードを入力してください。改善のお手伝いをさせていただきます。
アクティビティを作成するときは、アクティビティがまだ存在していないことを確認してください。存在する場合は、何もしません... Androidが自動的に再作成します。
private void initFragment() {
FragmentManager fragMgr = getSupportFragmentManager();
if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; }
frag = new HdrLeaderboardFragment();
FragmentTransaction ft = fragMgr.beginTransaction();
ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}