Передача объектов в фрагменты
Недавно я работал с большим количеством Fragments
и использовал два разных метода передачи объектов в Фрагменты, но единственное отличие, которое я вижу, это то, что в подходе, сделанном 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;
}
}
Ответы
Ответ 1
Есть 3 способа передать объекты фрагменту
Это:
- Передача объекта через сеттер является самым быстрым способом, но состояние не будет восстановлено автоматически.
-
setArguments
с объектами Serializable
является самым медленным способом (но, на мой взгляд, подходит для небольших объектов), и у вас есть автоматическое восстановление состояния.
- Передача как
Parcelable
- это быстрый способ (предпочитайте его над вторым, если у вас есть коллекция элементов для передачи), и у вас есть автоматическое восстановление состояния.
http://developer.android.com/reference/android/os/Parcelable.html
Ответ 2
для коллекции, например 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 по какой-то другой причине, вы можете избежать выполнения какой-либо дополнительной работы и только реализовать Parcelable для своего класса Locality.