14

私は1つのアクティビティ-複数のフラグメントアプリケーションを構築しています。トランザクションごとにバックスタックに追加します。フラグメントを非表示にして表示し、電話を回転させた後、コンテナに追加されたすべてのフラグメントが復元され、すべてのフラグメントが他のフラグメントの上に配置されます。

何が問題になる可能性がありますか?以前に非表示にしたフラグメントがアクティビティに表示されるのはなぜですか?

以前に非表示にされた現在表示されているフラグメントをすべて非表示にすることを考えていますが、これを行うためのより「優雅な」方法はありますか?

4

3 に答える 3

9

各フラグメントで使用するsetRetainInstance(true)と、問題が解消されます。
警告:これを true に設定すると、フラグメントのライフサイクルが変更されます。
問題は解決しsetRetainInstance(true)ますが、使用したくない場合があります。これを修正するには、フラグメントにブール属性を設定し、可視性を復元します。

private boolean mVisible = true;
@Override
public void onCreate(Bundle _savedInstanceState) {
    super.onCreate(_savedInstanceState);
    if (_savedInstanceState!=null) {
        mVisible = _savedInstanceState.getBoolean("mVisible");
    }
    if (!mVisible) {
        getFragmentManager().beginTransaction().hide(this).commit();
    }
    // Hey! no setRetainInstance(true) used here.
}
@Override
public void onHiddenChanged(boolean _hidden) {
    super.onHiddenChanged(_hidden);
    mVisible = !_hidden;
}
@Override
public void onSaveInstanceState(Bundle _outState) {
    super.onSaveInstanceState(_outState);
    if (_outState!=null) {
        _outState.putBoolean("mVisible", mVisible);
    }
}

構成が変更されると (画面の向きなど)、インスタンスは破棄されますが、バンドルは保存され、新しい Fragment インスタンスに挿入されます。

于 2013-09-22T02:00:17.233 に答える
0

replace()非表示にして表示するのではなく、関数を使用してみてください。使用を開始したときに同じ問題が発生Fragmentsし、置換機能を使用すると、管理がFragments改善されました。簡単な例を次に示します。

fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG)                                   
               .addToBackStack(null)
               .commit();
于 2012-08-10T17:02:21.773 に答える