2016-06-11 5 views
1

私は常に見える断片を持っています。なぜ私はバンドルを使ってデータをアクティビティから渡すべきなのか分かりません。ここバンドルを使用してデータをフラグメントに渡すのはなぜですか?

質問のほとんどは、データを渡すこの方法をお勧めします。

Bundle bundle=new Bundle(); 
bundle.putString("name", "From Activity"); 
Fragmentclass fragobj=new Fragmentclass(); 
fragobj.setArguments(bundle); 

は私が活動のOnCreateの機能にフラグメントオブジェクトを作成することを好むし、その後フラグメント(FragmentTransaction.add)を表示するには、このオブジェクトを使用します。私は、このフラグメントにrefenceを持っているとして、私はそれで()関数showNameを作成して作成し、そのような活動からそれを呼び出すことができます。このアプローチに何か問題が

myFragment.showName("name"); 

ありますか?

+4

ヒント:フレームワークがフラグメントを再作成する必要がある場合はどうなりますか? – laalto

答えて

1

データ値を設定するこの方法では何も問題はありません。名前を設定するビューがshowNameメソッドが呼び出された時点で実際に存在するように注意する必要があります。

情報を渡すためにバンドルを使用する理由の1つは、キーを使用してすべてのタイプのデータを保持でき、デバイスのローテーション中にビューステートを渡すために簡単に使用できることです。最終的には、それは好みの問題であり、まさにあなたのユースケースです。

7

Android documentation状態:

は、すべてのフラグメントが空のコンストラクタを持たなければならないので、その活性の状態を復元する際には、インスタンス化することができます。フラグメントが再インスタンス化されたときにこれらのコンストラクタが呼び出されることはないため、サブクラスにパラメータを持つ他のコンストラクタがないことを強くお勧めします。その代わりに、引数はsetArguments(Bundle)で呼び出し元から提供され、後でgetArguments()でFragmentによって取得できます。

それがこの方法をバンドルを使用し、フラグメントのパラメータを設定する方が良いでしょう理由です

それは断片が再インスタンス化されるときにその値を復元するためにシステムの方が簡単です。今


フラグメントのライフサイクルは、すでに(活動に取り付けられており、景色を膨らませ)が終了したので、代わりに、私はshowName("name")を呼び出すかどうかがわからないので、私はmyFragment.showName("name");を使用していないだろうonActivityCreatedまたはonViewCreatedコールバックにあります。

アプリケーションでは一般的にコンストラクタを実装しないでください。フラグメントが実際にそのアクティビティに関連付けられているポイントであるonAttach(Activity)に、フラグメントが使用可能な場所で実行できる最初のアプリケーションコードがあります。一部のアプリケーションでは、レイアウトリソースから属性を取得するためにonInflate(Activity、AttributeSet、Bundle)を実装したいと思うかもしれませんが、ここで注意する必要があるのはフラグメントがそのアクティビティに関連付けられているためです。

関連する問題