Fragmentへの値の渡し方
Activityクラスやフラグメント(Fragment)から別のフラグメントを起動するとき、値をそのフラグメントに渡す場合はBundleクラスを使って値の受け渡しを行います。
直接的な値の受け渡し
Bundleクラスで直接受け渡すことのできるデータの一覧はプリミティブ型を含み、次の通りです。
boolean, byte, char, CharSequence, double, float, int, long, Stringでは、int型を例にとって値の受け渡しを行ってみます。
まずは、フラグメントを呼び出す別のフラグメントクラスで次のようなコードを書きます。
FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); MyFragment fragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putInt("INT_KEY", 111); //値を書き込む fragment.setArguments(bundle); ft.replace(R.id.container, fragment).commit();
Bundleインスタンスを作り、そこからputIntメソッドを呼び出し、特定のキー(ここでは"INT_KEY")に値を書き込んでいます。
では、次に呼び出されるフラグメントで次のように値を受け取ります。
public class MyFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { int si = getArguments().getInt("INT"); Log.i("MyFragment : ", "渡された値 = " + Integer.toString(si)); } }
onCreateViewメソッド内でgetIntメソッドを使って目的のキーを持つ値を取り出しています。
ParcelableやSerializableを実装したインスタンスの受け渡し方
直接値を渡す以外にもParcelableやSerializableインターフェイスを実装しているクラスでは、putParcelableメソッドやputSerializableメソッドでインスタンスを保存・取得できます。
例えば、FileクラスはSerializableインターフェイスを実装しているので次のようにしてFileインスタンスを渡すことが可能です。
File file = getDir("my_dir", Context.MODE_PRIVATE); //Fileインスタンスを取得 FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); MyFragment fragment = new MyFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("FILE_KEY", file); //Fileインスタンスを書き込む。 fragment.setArguments(bundle); ft.replace(R.id.container, fragment).commit();
putSerializableメソッドで書き込んだインスタンスは次のように取り出せます。
public class MyFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { File file = (File) getArguments().getSerializable("FILE_KEY"); //Fileインスタンスの取り出し Log.i("MyFragment : ", "ファイル名 = " + file.getName()); } }
getSerializableクラスでSerializable型をキャストしてFileインスタンスを取得しています。
なので値を代入するときは目的のクラス型にキャストする必要があります。。
また、Parcelableを実装したクラス(Bitmapなど)についても同じようにputParcelableメソッドで値を保存し、getParcelableで値を読み出しできます。