Передача объекта в фрагмент или диалоговоефрагмирование при создании

Я пытаюсь найти правильный способ передать объект в фрагмент или диалоговое окно, не нарушая правило « пустой конструктор ».

Например, я создал пользовательский вид и для каждого экземпляра, который я создаю, я хочу связать DiaglogFragment. Этот DialogFragment будет использоваться для отображения элементов управления, с помощью которых пользователь может изменить некоторые аспекты пользовательского вида, с которым он связан. Поскольку View является объектом, я понимаю, что не могу использовать setArguments () .

Я мог бы реализовать метод newInstance (View) моего шаблона DialogFragment, т.е. Factory, но что произойдет, если мой фрагмент будет сохранен системой и затем восстановлен позднее? Насколько я могу судить, не будет ссылки на объект View?

Мог бы кто-нибудь сказать мне, если я использую Фрагменты не по-другому или есть способ добиться прохождения объекта к Фрагменту, который также справится с системой, восстанавливающей его позже.

Solutions Collecting From Web of "Передача объекта в фрагмент или диалоговоефрагмирование при создании"

В вашем классе DialogFragmnet вы создаете два метода:

  1. newInstance сделать экземпляр вашего DialogFragment

  2. Setter для инициализации вашего объекта

И добавьте 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"); 

Вы можете передать Object в дополнительных дополнениях как Parcelable Objects ( http://developer.android.com/reference/android/os/Parcelable.html ) и передать их в Bundle в onCreateView(Bundle savedInstanceState) . Вы можете сохранить их, если пользователь перевернет экран.

EDIT: этот Parcelable учебник был неплох!

Другой способ – получить объект данных из вашего ParentActivity, но я не уверен, что это хороший способ (но он работает ..)

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mYourObject = ((MainActivity) getActivity()).getYourObject(); } 

Вы должны создать Getter в своей деятельности для этого

 public YourObject getYourObject(){ return mYourObecjt; } 

Но я думаю, что Parcelables – лучший способ, потому что вы можете повторно использовать свои фрагменты без каких-либо зависимостей …

Вы всегда можете использовать красивую библиотеку JSON, такую ​​как GSON или Genson для сериализации объектов – это мой подход к любому удаленному сложному объекту. GSON немного более компактен для простых операций, но если у вас есть какие-либо наследования / полиморфизм в ваших взглядах, я бы настоятельно рекомендовал Genson. Вы можете иметь ctr с аргументом, когда вы документируете их.

https://code.google.com/p/genson/ – Получить JAR в разделе загрузки.

Я исправил свою потребность в sharepreference. YuzdeDataUser – это мой пользовательский класс, который я принимаю onClickItemListener из моего списка

Как отправить

  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()); }