2012-03-07 2 views
23

フラグメントを初めてインスタンス化するときには、setArguments(Bundle)を使用して引数を渡し、を使用してフラグメント内でそれらを取得することができます。フラグメントをアクティビティに追加した後に引数を渡すことはできますか?

しかし、私のアプリでは、アクティビティに追加された後、何回も切り離されて添付されるフラグメントがあります。再接続時には、フラグメントを再接続する前に、フラグメントの内容を変更するためにフラグメントを渡す必要があります。最初にフラグメントを表示するとsetArgumentsを使用できますが、それ以降の機会には機能しません。フラグメントを切り離す前に引数の値がわからないので、savedInstanceStateはこの場合は機能しません。

引数を設定するフラグメントをアタッチする前に呼び出すメソッドを実装することができますが、これはすでにAPIに存在する可能性があり、単に表示されていないようです。

私にこれを可能にする何か組み込みがありますか、それとも自分でこれを実装する必要がありますか?記録のために、私はサポートパッケージ(v4)を使用しています。

多くの感謝!

+0

再接続するとどういう意味ですか?フラグメントはアクティビティに1回だけアタッチされ(AFAIK)、アクティビティから切り離された場合、フラグメントは破棄されます。ユーザーが戻るボタンを押すと、フラグメントがレイアウトに返されますか? – 500865

答えて

12

フラグメントに渡したいものを設定するメソッドを公開することができます。あなたはそれを呼び出すことができます。タグでバックスタックからフラグメントを取得するか、インスタンス参照をどこから呼び出しているかを保持します。

これは、ヌルチェックの点で守備的である必要がありますが、フラグメントを添付したり再起動したときに断片が通過するライフサイクルを認識するだけでなく、うまく動作します。私はAPIで何もない伝えることができるものから、

...

更新:これはまだ本当であるとうまく動作します。これがより複雑になると、Ottoイベントバスのようなものを使うほうがはるかにクリーンで簡単になることが分かりました。非常にお勧めします。

+0

私が渡している引数は、ほんの些細です。実際にはフラグメントに追加されるコンテンツではありませんが、フラグメントはその値に基づいてコンテンツを表示/非表示にします。私は、おそらく私がやっていたことのためのAPIがあったと思うようになりました。ないと思います。助けてくれてありがとう! –

2

フラグメンテーションがアクティビティに追加された後で引数を渡すことは可能ですか?


しかし、あなたは、フラグメントが結ばれるための活動と通信する方法を探しているなら、あなたはそれを@manfredが言及した方法またはで説明した他の方法を行うことができますDocumentation

2つのフラグメントが互いに通信するもう1つの興味深い方法があります。これは、setTargetFragmentgetTargetFragmentの方法を使用することです。ここで、もしfragmentBfragmentAに影響を与えることができ、あなたfragmentBfragmentAへと変更がfragmentB内側からfragmentAに更新する必要がある場合、あなたは ((fragmentA) getTargetFragment())によって、それへの参照を取得し、それを更新するためにfragmentAのメソッドにアクセスするのsetTargetFragmentます。

希望します。がんばろう。

+0

フラグメントとの通信について質問していないので、フラグメントに設定された引数を変更する方法を尋ねています –

+0

あなたの「いいえ」は誤解を招きやすく、間違っていますので、OPsの質問に対する答えは@ user3978046 –

19

フラグメントがアクティブになる前に、setArguments(bundle)を呼び出していれば可能です。その後、そこからフラグメントが更新されるバンドルがあります。あなたの問題を避けるためには、元のバンドルを更新しなければならず、2度目にsetArgumentsを呼び出さないでください。だからあなたの最初のフラグメントの構築を以下の、そしてあなたのフラグメントで利用できるようになります

frg.getArguments().putString("someKey", "someValue"); 

引数のようなコードでフラグメントの引数を変更し、持続し、向きの変更と、そのような時に復元されます。

このメソッドは、レイアウトでxmlを使用してフラグメントを作成する場合にも便利です。通常、そのようなフラグメントに対して引数を設定することはできません。この制限を回避する方法は、そのような引数バンドルを作成し、引数なしのコンストラクタを作成しないことです。

public MyFragment() { 
    this.setArguments(new Bundle()); 
} 

その後どこかにあなたがするだろうあなたの活動ののonCreateメソッド内:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

これは、データを配置します引数バンドルに追加します。引数バンドルは、フラグメント内のコードに使用できます。

+0

Yaですが、フラグメントに引数を追加したことに気づく方法がありますか?私は引数を追加して、引数が再チェックされるようにアクティビティが呼び出すことができるフラグメントにメソッドを公開することができます。問題は、アクティビティがライフサイクルのどの段階で断片があるのか​​分からないことです。 – Glaucus

関連する問題