16

基本的に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)を呼び出そうとしました。

ありがとうございました

4

4 に答える 4

42

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
}
于 2012-05-17T12:57:45.880 に答える
0

両方の方向に同様の ui (特定のレイアウト ランド ファイルがない) がある場合は android:configChanges="keyboardHidden|orientation"、マニフェスト ファイルでアクティビティに設定できます。

タブにフラグメントを追加しているソース コードを提供しない場合は、改善をお手伝いします。

于 2012-05-17T11:35:12.753 に答える
0

アクティビティを作成するときは、それがまだ存在していないことを確認してください。存在する場合は、何もしません...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();
    }
于 2012-05-17T11:36:33.520 に答える