私は最近多くのFragments
で作業しており、オブジェクトをFragmentsに渡す2つの異なる方法を使用していますが、私が見ることができる唯一の違いは、以下のFragmentOneが取ったアプローチでは、渡すには、Serializable
インターフェイスを実装する必要があります( およびそれに関連するすべて )。
どちらか一方を使用する利点はありますか?
public class FragmentOne extends Fragment {
public static final String FRAGMENT_BUNDLE_KEY =
"com.example.FragmentOne.FRAGMENT_BUNDLE_KEY";
public static FragmentOne newInstance(SomeObject someObject) {
FragmentOne f = new FragmentOne();
Bundle args = new Bundle();
args.putSerializable(FRAGMENT_BUNDLE_KEY, someObject);
f.setArguments(args);
return f;
}
public SomeObject getSomeObject() {
return (SomeObject) getArguments().getSerializable(FRAGMENT_BUNDLE_KEY);
}
}
そして
public class FragmentTwo extends Fragment {
SomeObject mSomeObject;
public static FragmentTwo newInstance(SomeObject someObject) {
FragmentTwo fragment = new FragmentTwo();
fragment.setSomeObject(someObject);
return fragment;
}
public void setSomeObject(SomeObject someObject) {
mSomeObject = someObject;
}
}
オブジェクトをフラグメントに渡すには3つの方法があります
彼らです:
setArguments
オブジェクトを使用するSerializable
は最も遅い方法ですが(小さなオブジェクトでも大丈夫だと思います)、自動的に状態を復元します。Parcelable
として渡すことは高速な方法で(渡す要素のコレクションがある場合は2番目の方法よりも優先します)、自動状態復元があります。http://developer.Android.com/reference/Android/os/Parcelable.html
listなどのコレクションの場合:
私の経験を共有したかった。
parcelableを実装する必要があります
PutParcelableArrayListメソッドを使用するだけです。
ArrayList<LClass> localities = new ArrayList<LClass>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
fragmentInstance.setArguments(bundle);
return fragmentInstance;
そしてそれを使用して取得...
localities = savedInstanceState.getParcelableArrayList(KEY_LCLass_LIST);
そのため、他の何らかの理由でカスタムArrayListが必要な場合を除き、余分な作業を行わずに、LocalityクラスにのみParcelableを実装できます。