2017-08-23 14 views
1

多くの記事とStackOverflowの回答を読みましたが、フラグメントのインスタンスを作成するためにファクトリメソッドが必要な理由を理解できません。Androidフラグメントのインスタンス化:newInstance()

次のフラグメントクラスはどちらも正常に動作します。

2つのコンストラクタを持つフラグメント:

public class CtorFragment extends Fragment { 
    private static final String KEY = "the_key"; 

    public CtorFragment() { 
     // Android calls the default constructor so default constructor must be explicitly defined. 
     // As we have another constructor, Android won't create a default constructor for us. 
    } 

    public CtorFragment(String s) { 
     // Set the arguments. 
     Bundle bundle = new Bundle(); 
     bundle.putString(KEY, s); 

     setArguments(bundle); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
     View fragment = inflater.inflate(R.layout.fragment_my, container, false); 
     TextView textView = (TextView) fragment.findViewById(R.id.textView); 

     // Use getArguments() to get the String argument set by the constructor with parameter. 
     textView.setText(getArguments().getString(KEY)); 
     return fragment; 
    } 
} 

フラグメントstaticファクトリメソッドを持つ:

public class StaticFragment extends Fragment { 
    private static final String KEY = "the_key"; 

    public static StaticFragment newInstance(String s) { 
     StaticFragment fragment = new StaticFragment(); 
     // Set the arguments. 
     Bundle bundle = new Bundle(); 
     bundle.putString(KEY, s); 

     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
     View fragment = inflater.inflate(R.layout.fragment_my, container, false); 
     TextView textView = (TextView) fragment.findViewById(R.id.textView); 

     // Use getArguments() to get the String argument set by the constructor with parameter. 
     textView.setText(getArguments().getString(KEY)); 
     return fragment; 
    } 
} 

(グーグルを含む)全員が、静的な工場で1を「強くお勧め」理由を説明していただけます方法?私と他の人がAn​​droid以外のバックグラウンドから逃れることが重要なことはありますか?

私たちはすべての騒ぎを引き起こすもの(静的なファクトリメソッド)ではなく、2つのメソッド(コンストラクタ)を定義する必要がありますか?

+0

任意のファクトリメソッドと同様に、それは簡単 'それが簡単'新しいCtorFragment(「テキスト」)を書くことよりも、 '' StaticFragment.newInstance(「テキスト」)を書くことがいかに – Ramanlfc

+0

@Ramanlfcクライアントにインスタンスを提供しますか? –

+0

私はタイピングを意味しませんでした。つまり、良い抽象を提供しています。 – Ramanlfc

答えて

1

newInstanceの目的は、主にフラグメントの初期値を設定することです。フラグメントにデフォルトのコンストラクタを使用している場合、引数を初期値を送信する手段として設定することはできません。


はこちらhttps://stackoverflow.com/a/9245510/4758255から引用し、詳細の説明です:

Androidは後でフラグメントを再作成することを決定した場合、あなたのフラグメントの引数なしのコンストラクタを呼び出すために起こっている

。したがって、コンストラクタのオーバーロードは解決策ではありません。

これは、フラグメントがAndroidによって再作成された後に利用できるように、フラグメントにアイテムを渡す方法は、setArgumentsメソッドにバンドルを渡すことです。

あなたが使用して、その整数にアクセスすることができます onCreate()フラグメントで
public static MyFragment newInstance(int someInt) { 
    MyFragment myFragment = new MyFragment(); 

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

    return myFragment; 
} 

以降:

getArguments().getInt("someInt", 0); 
我々はフラグメントに整数を渡したい場合

ので、例えば、私たちのようなものを使用します

このバンドルは、フラグメントがAndroidによって何らかの形で再作成された場合でも利用できます。

注:setArgumentsは、フラグメントがアクティビティに添付される前にのみ呼び出すことができます。

このアプローチはまた、Androidデベロッパーリファレンスに記載されています:https://developer.android.com/reference/android/app/Fragment.html

+0

質問に 'CtorFragment'クラスがありますか?どのように引数を設定できないのですか? –

+0

@MertAkcakayaは、フラグメントを再作成する必要がある場合、OSはデフォルトのコンストラクタを呼び出し、引数をバンドルとしてフラグメントに渡します。 [フラグメントには本当に空のコンストラクタが必要ですか?](https://stackoverflow.com/a/10450535/1449010)の説明を参照してください。 –

1

私たちは「必要性」フラグメント

のインスタンスを作成するファクトリメソッドを必要とする理由はまだ理解できないが強いですワード。あなたはファクトリメソッドを "必要としません"。あなたは必要がありますか

  • 公共ゼロ引数コンストラクタ、理想的には空を。 (グーグルを含む)全員が静的で1を「強くお勧め」理由と構成を生き残る方法で、フラグメントをセットアップする

  • 整理手段が

を変えるあなたは説明していただけます工場の方法?

あなたはJavaクラスの明示的なコンストラクタを持っていない場合は、自動的にフレームワークがフラグメントを作成するために必要なものである空の公共ゼロ引数コンストラクタを取得します。

引数をとるコンストラクタ(たとえばCtorFragment(String s))を作成する場合は、引数のない0のコンストラクタ(CtorFragment())も作成する必要があります。これを忘れないでください。経験の浅いプログラマーの多くはそうしないでしょう。

ファクトリメソッドを書くことは、自動的に作成されたゼロ引数コンストラクタを壊さずに、非ゼロ引数コンストラクタと同じ目的を達成します。

経験豊富なJavaプログラマーで、ファクトリメソッドが嫌い、スタックトレースを読み込むことができます。パブリックゼロの引数のコンストラクタを追加することを忘れないでください。追加のコンストラクタを作成して使用することは歓迎します。

関連する問題