設定の変更(ローテーションなど)でアクティビティが再作成されると、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アプリがあります。
[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();
}
}
フラグメントを隠していて、追加/削除していないのはなぜですか? – Scrotos
私は問題の詳細な文脈を与えるために編集しました。追加/削除/置換すると、フラグメントはonCreateViewのようなライフサイクルを経て、再構築されます。私はそれがライフサイクルメソッドを通過することは大丈夫ですが、フラグメントが以前と同じビュー状態になるようにします。例えばリサイクラービューのスクロール位置など。 – awonderer
フラグメントの状態を、recyclerviewのスクロール位置を含むonSaveInstanceStateに保存しておき、onCreateまたはonCreateViewのバンドルに基づいてスクロール位置を設定する必要があります。 – Scrotos