Fragmentオーバーラップ問題の完璧な解決


1.Fragmentの重複と隠蔽の原因
主にFragmentの状態保存メカニズムのため、システムメモリが不足するとFragmentのメインActivityが回収され、Fragmentのインスタンスは回収されません.
Activityがシステムによって回収されると、onSaveInstance()メソッドがアクティブに呼び出されてビューレイヤ(ViewHierarchy)が保存されるので、Activityがナビゲーションによって再構築されると、以前にインスタンス化されたFragmentは依然としてActivityに現れるが、上記のコードから明らかなように、新しいFragmentが再構築され、これらの要因により複数のFragmentが重なる.
2.この問題が必須でない場合は、デバッグ時に開発者オプションの「アクティビティを保持しない」を開き、Activityをシミュレートするためにタイムリーに回収できます.
3.onSaveInstanceState()とonRestoreInstanceState()の2つの方法.
システムがActivityをメモリで回収した場合にのみ呼び出されると思っていたonSaveInstanceState()は、他のActivityにジャンプしたり、マルチタスクウィンドウを開いたり、ホームを使用してメイン画面に戻ったりする操作でも呼び出されたが、onRestoreInstanceState()はActivityに戻った場合に呼び出されなかった.そして私がonResume()で発見した前のFragmentは削除されただけで空ではないので、onResume()で問題1で作成したFragmentの方法を実行しても、同じように役に立たない.だからremove()で失敗を宣言します.
次に調査資料を通じてActivityの中のonSaveInstanceState()にsuperがあることを発見した.onRestoreInstanceState(savedInstanceState)、Googleはこの言葉について「Always call the superclass so it can save the view hierarchy state」と解釈し、「親を呼び出してビューレイヤの状態を保存する」という意味だろう.実はここまでみんなも分かっていたのは、この言葉がゴーストを起こしたからだということで、私はこの言葉を削除して、onCreate()とonRestoreInstanceState()で問題の1つであるFragmentの作成方法を同時に使って、それから切り替えの状態を保存することで、結果が非常に完璧であることを発見しました.
// Fragment 
    private int position = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);

        setTabSelection(position);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        position = savedInstanceState.getInt("position");
        setTabSelection(position);
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // position
        outState.putInt("position", position);
    }