J'ai travaillé avec beaucoup de Fragments
récemment et j'ai utilisé deux méthodes distinctes pour passer des objets aux Fragments, mais la seule différence que je peux voir est que dans l'approche adoptée par FragmentOne ci-dessous, l'objet vous passez doit implémenter l'interface Serializable
( et tout ce qui y est associé ).
Y a-t-il des avantages à utiliser l'un par rapport à l'autre?
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);
}
}
et
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;
}
}
Il existe 3 façons de passer des objets à un fragment
Elles sont:
setArguments
avec Serializable
objets est le moyen le plus lent (mais d'accord pour les petits objets, je pense) et vous avez une restauration d'état automatique.Parcelable
est un moyen rapide (préférez-le au 2e si vous avez une collection d'éléments à passer), et vous avez une restauration d'état automatique.http://developer.Android.com/reference/Android/os/Parcelable.html
pour Collection comme List:
Je voulais partager mon expérience.
vous devez implémenter Parcelable
Utilisez simplement la méthode putParcelableArrayList.
ArrayList<LClass> localities = new ArrayList<LClass>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
fragmentInstance.setArguments(bundle);
return fragmentInstance;
Et récupérez-le en utilisant ...
localities = savedInstanceState.getParcelableArrayList(KEY_LCLass_LIST);
Donc, à moins que vous n'ayez besoin de la liste de tableaux personnalisée pour une autre raison, vous pouvez éviter de faire tout ce travail supplémentaire et n'implémenter que Parcelable pour votre classe Locality.