web-dev-qa-db-ja.com

AndroidフラグメントのgetIntent()。getExtras()の場所/方法

アクティビティでは、これを使用していました。

アクティビティ1:

Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class);
                i.putExtra("name", items.get(arg2));
                i.putExtra("category", Category);
                startActivity(i);

アクティビティ2で:

Item = getIntent().getExtras().getString("name");

フラグメントを使用してこれをどのように行いますか?互換性ライブラリv4も使用しています。

FragmentActivityに含まれますか?それとも実際のフラグメントですか?そして、それはどの方法に行きますか? onCreate? onCreateView?別の?

また、サンプルコードをご覧ください。

編集:アクティビティ1をアクティビティとして(または実際にはクリックするとリストアイテムの意図を渡すListActivity)を維持し、(フラグメントアクティビティを介して)タブ付きフラグメントのセットに渡すことを試みていることに注目する価値がありますエキストラを取得するには、いずれかのタブが必要です。 (これが可能になることを望みますか?)

99
KickingLettuce

私がやろうとしていること、そしてこれはGoogleが開発者に対しても意図していることだと思います、それでもIntentActivityから余分なものを取得し、引数でインスタンス化して余分なデータをフラグメントに渡すことです。

実際には、この概念を示すAndroid devブログに があり、これはいくつかのAPIデモでも見ることができます。この特定の例はAPI 3.0+フラグメントに対して提供されていますが、サポートライブラリのFragmentActivityおよびFragmentを使用する場合も同じフローが適用されます。

まず、アクティビティで通常どおりインテントエクストラを取得し、それらを引数としてフラグメントに渡します。

public static class DetailsActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // (omitted some other stuff)

        if (savedInstanceState == null) {
            // During initial setup, plug in the details fragment.
            DetailsFragment details = new DetailsFragment();
            details.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().add(
                    Android.R.id.content, details).commit();
        }
    }
}

コンストラクタを直接呼び出す代わりに、引数をフラグメントにプラグインする静的メソッドを使用する方がおそらく簡単です。このようなメソッドは、多くの場合、 Googleが提供する例newInstanceと呼ばれます。 newInstanceにはDetailsFragmentメソッドが実際にあるので、上記のスニペットで使用されない理由がわかりません...

とにかく、フラグメントの作成時に引数として提供されるすべての追加機能は、getArguments()を呼び出すことで利用できます。これはBundleを返すため、その使用法はActivityのエクストラの使用法に似ています。

public static class DetailsFragment extends Fragment {
    /**
     * Create a new instance of DetailsFragment, initialized to
     * show the text at 'index'.
     */
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }

    // (other stuff omitted)

}
108
MH.

あなたはまだ使用できます

String Item = getIntent().getExtras().getString("name");

fragmentでは、最初にgetActivity()を呼び出す必要があります。

String Item = getActivity().getIntent().getExtras().getString("name");

これにより、コードを記述する必要がなくなります。

168
meeeee