読者です 読者をやめる 読者になる 読者になる

うさがにっき

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

fragmentのコンストラクタ、getInstanceメソッドについて

概要

fragmentを使う際、以下のようなgetInstanceメソッドを使ってインスタンスを作っているコードをよく見かける

public static SimpleFragment getInstance(int position) {
    SimpleFragment f = new SimpleFragment();
    Bundle args = new Bundle();
    args.putInt("position", position);
    f.setArguments(args);
    return f;
}

なぜコンストラクタを使わないのか?

まとめ

まず大前提としてfragmentはコンストラクタに引数を渡してはいけない

Fragment | Android Developers

All subclasses of Fragment must include a public empty constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it. If the empty constructor is not available, a runtime exception will occur in some cases during state restore.

メモリの破棄などで、fragment再生成時空のコンストラクタが存在しない場合、再生成時に落ちる。
ちなみにsetterを作って渡す方法もダメ、再生成で落ちないけどsetterは呼ばれないので値が保存されない。
なので、Bundleを使ってパラメータを渡す必要がある。Bundleなら
Fragment | Android Developers
で再生成時設定してくれる。

んで、いちいち呼び出し側でデフォルトコンストラクタ呼んでbundleに値を設定するのがめんどくさい。
ので、getInstanceメソッドを用意しておき、パラメータをbundleに設定するようにしてあげると利用するとき楽。
なので、このパターンがよく使われている様子。
頭いい

参考
Y.A.M の 雑記帳: Android Fragment で setArguments() してるサンプルが多いのはなぜ?
Using newInstance() to Instantiate a Fragment | Android Design Patterns