うさがにっき

読書感想文とプログラムのこと書いてきます

fragmentの再生成時、状態を引き継ぐ方法について

概要

画面回転やメモリ不足によってfragmentがシステムによって破棄されることがある
破棄されたfragmentは自動で再生成されるが、再生成されたfragmentを利用する方法をまとめる

詳細

このようなFragmentの管理をしていると常に新しいFragmentインスタンスが作成され、再生成されたfrgmentを再利用できない(checkboxの変更などが保存されない)

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

        // 常に新しいインスタンスを作成するようにしていると再生成前の状態を引き継げない
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

状態を引き継ぐために以下の2通りの方法がある

savedInstanceStateをnullチェックする

システムからActivityが再生成される際にはsavedInstanceStateがnullじゃないため、それを利用してfragmentのインスタンスを作成するタイミングを合わせる

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

findFragmentByTagを利用してonCreate時にFragmentが作成されているか確認する

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


        PlaceholderFragment fragment;

        FragmentManager manager = getFragmentManager();
        Fragment f = manager.findFragmentByTag("main");

        if(f != null) {
            // システムから自動削除された時はこちらに
            fragment = (PlaceholderFragment)f;
        }else {
            fragment = new PlaceholderFragment();
            // 起動時は作られてないのでこっち
            getFragmentManager().beginTransaction()
                    .add(R.id.container, fragment)
                    .commit();

        }

    }

参考

tatsu-zine.com