2

設定の変更(ローテーションなど)でアクティビティが再作成されると、FragmentTransactionのhide()は保持されません。FragmentTransactionは、アクティビティの再作成時に変更します。

バックスタック内のすべてのフラグメントを再追加するため、以前隠されていたフラグメントが表示されます。例)フラグメントA(非表示)、B(表示)、C(非表示)、D(非表示)はバックスタックにあります。たとえば、回転すると、A、B、Cをロードした後、断片Dが上に表示されます。

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); 

    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out); 

    // Hide all fragments other than the first 
    for (int i = 1; i < fragments.length; i++) { 
     if (fragments[i] != null) { 
      ft.hide(fragments[i]); 
     } 
    } 

    // Display only the first fragment 
    if (fragments[0].isAdded()) { 
     ft.show(fragments[0]); 
    } 
    else { 
     ft.add(R.id.content_view, fragments[0], fragmentTag); 
    } 

    ft.commit(); 

この問題を回避する方法はありますか?

[編集]問題のコンテキストの詳細を追加します。

私が達成しようとしているのは、下のバー(どのタブがタップされているかを私に伝えるカスタムビュー)を持っていることです。

例としてInstagram、Quora、Google Plusアプリがあります。

enter image description here

[Scrotosに応じて編集2]これは私のプレゼンタークラスです。 loadFirstScreen()は上記のフラグメントトランザクションを実行します。他のものはコンテンツの設定やリスナーの登録などの初期化だけです。

public void onCreate(Bundle savedInstanceState) { 
    mView.initActionbar(); 
    mView.initViews(); 
    mModel.getUserProfile().subscribe(new Subscriber<UserProfile>() { 
     @Override 
     public void onCompleted() { 
     } 

     @Override 
     public void onError(Throwable e) { 
     } 

     @Override 
     public void onNext(UserProfile userProfile) { 
      mView.initDrawer(userProfile); 
     } 
    }); 

    if (savedInstanceState == null) { 
     mView.loadFirstScreen(); 
    } 
} 
+0

フラグメントを隠していて、追加/削除していないのはなぜですか? – Scrotos

+0

私は問題の詳細な文脈を与えるために編集しました。追加/削除/置換すると、フラグメントはonCreateViewのようなライフサイクルを経て、再構築されます。私はそれがライフサイクルメソッドを通過することは大丈夫ですが、フラグメントが以前と同じビュー状態になるようにします。例えばリサイクラービューのスクロール位置など。 – awonderer

+0

フラグメントの状態を、recyclerviewのスクロール位置を含むonSaveInstanceStateに保存しておき、onCreateまたはonCreateViewのバンドルに基づいてスクロール位置を設定する必要があります。 – Scrotos

答えて

0

実際に問題のコードが機能しました。設定の変更からレクリエーション中にフラグメント内のhidden()がtrueの場合、アクションバーのタイトルを設定しないように注意してください。

チャットのための@Scrotosに感謝します。

0

表示されているアプリケーションでは、コンテナIDに基づいてフラグメントが削除/追加されている可能性があります。 onCreateまたはonCreateViewのonSaveInstanceStateとsavedInstanceStateバンドルを使用してフラグメント状態を維持しながらも、

+0

onSaveInstanceState()は単に 'replace()'を呼び出すときに呼び出されません。何か不足していますか? – awonderer

関連する問題