Передача объекта в фрагмент или Диалоговое изображение при создании объекта
Я пытаюсь найти правильный способ передать объект в Fragment или DialogFragment, не нарушая правило empty constructor.
Например, я создал собственный просмотр и для каждого экземпляра, который я создаю, я хочу связать DiaglogFragment. Этот DialogFragment будет использоваться для отображения элементов управления, с помощью которых пользователь может изменять определенные аспекты пользовательского вида, с которым он связан. Поскольку View является объектом, я понимаю, что не могу использовать setArguments().
Я мог бы реализовать метод newInstance (View) моего шаблона DialogFragment i.e. Factory, но тогда что произойдет, если мой Фрагмент будет сохранен системой и затем восстановлен позднее? Насколько я могу судить, ссылки на объект View не будут отображаться?
Может ли кто-нибудь сказать мне, если я использую Фрагменты не по-другому или есть способ добиться прохождения в объекте к фрагменту, который также справится с системой, восстанавливающей его позже.
Ответы
Ответ 1
В вашем классе DialogFragmnet
вы создаете два метода:
и добавьте setRetainInstance(true);
в onCreate
public class YourDialogFragment extends DialogFragment {
ComplexVariable complexVar;
public static YourDialogFragment newInstance(int arg, ComplexVariable complexVar) {
YourDialogFragment frag = new MoveSongDialogFragment();
Bundle args = new Bundle();
args.putInt("count", arg);
frag.setArguments(args);
frag.setComplexVariable(complexVar);
return frag;
}
public void setComplexVariable(ComplexVariable complexVar) {
this.complexVar = complexVar;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
}
затем, чтобы показать диалог
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
Fragment prev = manager.findFragmentByTag("yourTag");
if (prev != null) {
ft.remove(prev);
}
// Create and show the dialog.
DialogFragment newFragment = YourFragmentDialog.newInstance(argument, yourComplexObject);
newFragment.show(ft, "yourTag");
Ответ 2
Вы можете передать Объект в дополнительные объекты как Parcelable Objects (http://developer.android.com/reference/android/os/Parcelable.html) и передать их в Bundle в onCreateView(Bundle savedInstanceState)
. Вы можете сохранить их, если пользователь перевернет экран.
РЕДАКТИРОВАТЬ: this Исходное учебное пособие было неплохое!
Другой способ - получить объект данных из вашего ParentActivity, но я не уверен, что это хороший способ (но он работает..)
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mYourObject = ((MainActivity) getActivity()).getYourObject();
}
вам нужно создать Getter в своей деятельности для этого
public YourObject getYourObject(){
return mYourObecjt;
}
Но я думаю, что Parcelables - лучший способ, потому что вы можете повторно использовать свои фрагменты без каких-либо зависимостей...
Ответ 3
Вы можете всегда использовать красивую JSON библиотеку, такую как GSON или Genson для сериализации объектов - это мой подход к любому удаленному сложному объекту. GSON немного более компактен для простых операций, но если у вас есть какие-либо наследования/полиморфизм в ваших взглядах, я бы очень рекомендовал Genson. Вы можете иметь ctr с аргументом, когда вы документируете их.
https://code.google.com/p/genson/ - Получите JAR в разделе загрузки.
Ответ 4
Я исправил свою потребность с sharepreference. YuzdeDataUser - это мой пользовательский класс, который я принимаю onClickItemListener из My Listview
Как отправить
YuzdeDataUser clickedObj = (YuzdeDataUser) parent.getItemAtPosition(position);
//clickedObj.setTarihim();
SharedPreferences shp = getSharedPreferences("sam", MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
Gson gson = new Gson();
String json = gson.toJson(clickedObj);
editor.putString("yoklamaList", json);
editor.commit();
FragmentManager fragmentManager = getSupportFragmentManager();
AylikRaporPop userPopUp = new AylikRaporPop();
userPopUp.show(fragmentManager, "sam");
Как получить
SharedPreferences shp = parent.getSharedPreferences("sam", MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
Gson gson = new Gson();
String json = shp.getString("yoklamaList", "");
YuzdeDataUser user = gson.fromJson(json, YuzdeDataUser.class);
if (user != null) {
txt_ad.setText(user.getAd());
txt_tur_tarih.setText(Util.getInstance(parent).writeNameOfTur(user.getTur_id()));
txt_var.setText("" + user.getVar());
txt_gorevli.setText("" + user.getGorevli());
txt_yok.setText("" + user.getYok());
}