私がしがちなこと、そしてこれはグーグルが開発者にも意図したことだと私は信じています。それでも、引数を使ってそれらをインスタンス化することによって、から余分なデータを取得し、フラグメントに余分Intent
なActivity
データを渡します。
この概念を説明する例がAndroiddevブログに実際にあり、これはいくつかのAPIデモでも確認できます。この特定の例はAPI3.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();
}
}
}
コンストラクターを直接呼び出す代わりに、引数をフラグメントにプラグインする静的メソッドを使用する方がおそらく簡単です。このようなメソッドは、GooglenewInstance
の例でよく呼び出されます。実際にはに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)
}