Подтвердить что ты не робот

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

Я пытаюсь найти правильный способ передать объект в Fragment или DialogFragment, не нарушая правило empty constructor.

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

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

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

4b9b3361

Ответ 1

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

  • newInstance, чтобы сделать экземпляр вашего DialogFragment

  • 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");

Ответ 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());

    }