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

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

Недавно я работал с большим количеством 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;
    }
}
4b9b3361

Ответ 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.