アプリケーションで新しいフラグメントをインスタンス化する一般的な方法として、次の 2 つがあります。
Fragment newFragment = new MyFragment();
そして
Fragment newFragment = MyFragment.newInstance();
2 番目のオプションは静的メソッドを使用しnewInstance()
、通常は次のメソッドが含まれます。
public static Fragment newInstance()
{
MyFragment myFragment = new MyFragment();
return myFragment;
}
最初は、主な利点は、Fragment の新しいインスタンスを作成するときに柔軟性を持たせるために newInstance() メソッドをオーバーロードできることだと思いましたが、Fragment のオーバーロードされたコンストラクターを作成することによってもこれを実現できました。
私は何か見落としてますか?
一方のアプローチが他方のアプローチよりも優れている点は何でしょうか? それとも、単に良い習慣なのでしょうか?
ベストアンサー1
Android が後でフラグメントを再作成することにした場合、フラグメントの引数なしのコンストラクターが呼び出されます。したがって、コンストラクターをオーバーロードすることは解決策ではありません。
そうは言っても、Android によってフラグメントが再作成された後にフラグメントに何かを渡し、それらを利用できるようにするには、メソッドにバンドルを渡すことですsetArguments
。
たとえば、フラグメントに整数を渡したい場合は、次のようなものを使用します。
public static MyFragment newInstance(int someInt) {
MyFragment myFragment = new MyFragment();
Bundle args = new Bundle();
args.putInt("someInt", someInt);
myFragment.setArguments(args);
return myFragment;
}
フラグメントの後半では、次のコードonCreate()
を使用してその整数にアクセスできます。
getArguments().getInt("someInt", 0);
このバンドルは、フラグメントが Android によって何らかの方法で再作成された場合でも利用できます。
また、注意:setArguments
フラグメントがアクティビティに接続される前にのみ呼び出すことができます。
このアプローチは、Android 開発者リファレンスにも記載されています。フラグメント