24

アクティビティから、アクティビティに埋め込まれたフラグメントに引数を渡したいです。フラグメントは、xml レイアウトに静的に埋め込まれます。次のように setArgument() を呼び出そうとしました:

setContentView(R.layout.detail_activity);
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
detailFragment.setArguments(getIntent().getExtras());

しかし、フラグメントの作成直後に setArguments を呼び出さなければならないため、すでに手遅れです。getArguments() とバンドルを変更するだけでした。より良い方法はありますか?

4

3 に答える 3

5

ここには2つのオプションがあります

  1. アクティビティのインテントに情報が必要なだけの場合、インテントからの情報をフラグメント引数に配置すると、不要なステップが追加されるだけです。物事をシンプルに保ち、フラグメント呼び出しから

    Bundle data = getActivity().getIntent().getExtras();
    
  2. アクティビティの意図にない情報を追加する必要がある場合は、フラグメントで次のようなパラメーターなしのコンストラクターを作成します。

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

次に、アクティビティで、次のようなコードで必要な引数を追加できます。

    DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
    frg.getArguments().putBundle("key", data);

ここでのポイントは、フラグメントがアクティビティにアタッチされた後に setArguments() を呼び出そうとするのではなく、既存のバンドル オブジェクトを使用することです。

于 2014-08-29T08:23:27.053 に答える
4

Another way to pass data to Fragment is as following:

//In DetailFragment (for Instance) define a public static method to get the instance of the fragment

public static final DetailFragment getInstance(Bundle data) {
    DetailFragment fragment = new DetailFragment();
    fragment.setArguments(data);
    return fragment;
}

And when attaching DetailFragment from inside Activity

Bundle data = new Bundle();
//Add data to this bundle and pass it in getInstance() of DetailFragment
fragmentTransaction.replace(R.id.frament_layout, DetailFragment.getInstance(data));
于 2015-10-06T05:31:25.477 に答える