1. ホーム
  2. android

[解決済み] 新しいAndroid Fragmentをインスタンス化するためのベストプラクティス

2022-03-25 12:19:45

質問

アプリケーションで新しいフラグメントをインスタンス化するために、2つの一般的な方法を見たことがあります。

Fragment newFragment = new MyFragment();

そして

Fragment newFragment = MyFragment.newInstance();

2つ目のオプションは、静的メソッドを使用するものです。 newInstance() 一般に には、以下のメソッドが含まれています。

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

当初は、newInstance()メソッドをオーバーロードすることで、Fragmentの新しいインスタンスを柔軟に作成できることが主な利点だと考えていました。

何か見逃してない?

一方のアプローチと他方のアプローチのメリットは何でしょうか?それとも、単に良い練習方法なのでしょうか?

どのように解決するのか?

Androidが後からFragmentを再作成する場合、Fragmentの無引数コンストラクタを呼び出すことになります。そのため、コンストラクタをオーバーロードすることは解決策になりません。

とはいえ、AndroidによってFragmentが再作成された後でも利用できるように、Fragmentにものを渡す方法は、バンドルに setArguments メソッドを使用します。

つまり、例えば、フラグメントに整数を渡したい場合は、次のような使い方をします。

public static MyFragment newInstance(int someInt) {
    MyFragment myFragment = new MyFragment();

    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    myFragment.setArguments(args);

    return myFragment;
}

そして、この後のFragmentでは onCreate() を使えば、その整数にアクセスできる。

getArguments().getInt("someInt", 0);

このBundleは、Androidによって何らかの方法でFragmentが再作成された場合でも、利用可能です。

また、注意してください。 setArguments は、FragmentがActivityにアタッチされる前にのみ呼び出すことができます。

この方法は、android developer referenceにも記載されています。 https://developer.android.com/reference/android/app/Fragment.html