Передача объектов в фрагменты

Я работал со многими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;
    }
}
 Martyn31 мая 2012 г., 18:11
Спасибо за ответ Марку. Мне кажется, что другой ответ, на который вы ссылаетесь, аналогичен, но достаточно отличается от того, что я прошу здесь, чтобы сделать этот вопрос еще полезным.
 CommonsWare31 мая 2012 г., 18:18
Затем, возможно, отредактируйте свой вопрос, чтобы сделать различия более очевидными. Каждый из вас хочет передать данные во вновь созданный фрагмент. В ответе на вопрос, с которым я связан, я показал стандартную схему передачи данных во вновь созданный фрагмент. Если вы ожидаете чего-то большего, вам нужно объяснить, что такое «больше» является.
 CommonsWare31 мая 2012 г., 17:35
возможный дубликатProper way to give initial data to fragments
 CommonsWare31 мая 2012 г., 17:36
Также используйтеParcelable в отличие отSerlializable, если вам действительно не нужноSerializable для некоторых не-специфических для Android целей.Parcelable по-видимому, намного быстрее.

Ответы на вопрос(2)

для коллекции, такой как список:

Я хотел поделиться своим опытом.

вам нужно реализовать 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.

Решение Вопроса

Есть 3 способа передать объекты во фрагмент

Они есть:

Passing the object through a setter is the fastest way, but state will not be restored automatically. setArguments with Serializable objects is the slowest way (but okay for small objects, I think) and you have automatic state restoration. Passing as Parcelable is a fast way (prefer it over 2nd one if you have collection of elements to pass), and you have automatic state restoration.

http://developer.android.com/reference/android/os/Parcelable.html

 04 июн. 2013 г., 17:07
в 1) setRetainInstance сохранит инициализированный экземпляр как есть. Когда мы идем куда-то еще и уничтожаем приложение, мы не можем восстановить данные. Так что это может быть вариант в частных случаях.
 04 июн. 2013 г., 14:43
AFAIK, в 1) вы автоматически восстановили состояние, если используете setRetainInstance (true)
 09 мая 2017 г., 07:04
Большое спасибо за идеальное решение.

Ваш ответ на вопрос