Я создаю приложение с Fragments
и в одном из них я создал конструктор не по умолчанию и получил это предупреждение:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
Может кто-нибудь сказать мне, почему это не очень хорошая идея?
Можете ли вы также предложить, как я мог бы сделать это:
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
Без использования конструктора не по умолчанию?
android
android-fragments
BlackHatSamurai
источник
источник
Ответы:
Сделайте объект связки и вставьте свои данные (в этом примере ваш
Category
объект). Будьте осторожны, вы не можете передать этот объект непосредственно в пакет, если он не сериализуем. Я думаю, что лучше построить свой объект во фрагменте и поместить в связку только идентификатор или что-то еще. Это код для создания и прикрепления пакета:После этого в вашем фрагменте получите доступ к данным:
Вот и все.
источник
Parcelable
объекты. Кроме того , вы не должны пропускатьContext
, потому что эта информация может быть доступна через фрагментаgetActivity()
метода .Type value = getArguments().getType("key");
?newInstance()
методу. Например:public static FragmentName newInstance(your variables){}
. Как рекомендует документация Android, не создавайте конструктор с параметрами, потому что конструктор по умолчанию (без параметров) будет вызываться автоматически после перезапуска вашего фрагмента.Кажется, что ни один из ответов на самом деле не отвечает «зачем использовать пакет для передачи параметров, а не конструкторы по умолчанию»
Причина, по которой вы должны передавать параметры через пакет, заключается в том, что когда система восстанавливает
fragment
(например, при изменении конфигурации), она автоматически восстанавливает вашиbundle
.Обратные вызовы, такие как
onCreate
илиonCreateView
должны читать параметры изbundle
- таким образом вы гарантированно восстановитеfragment
правильное состояние до того же состояния, с которым оноfragment
было инициализировано (обратите внимание, что это состояние может отличаться от тогоonSaveInstanceState bundle
, которое передается вonCreate/onCreateView
)Рекомендация использования статического
newInstance()
метода - это просто рекомендация. Вы можете использовать конструктор не по умолчанию, но убедитесь, что вы заполняете параметры инициализацииbundle
внутри тела этого конструктора. И прочитайте эти параметры вonCreate()
илиonCreateView()
методах.источник
У вас
Fragment
не должно быть конструкторов из-за того, как ониFragmentManager
создаются. У вас должен бытьnewInstance()
статический метод, определенный с нужными вам параметрами, затем связать их и установить в качестве аргументов фрагмента, к которому вы позже сможете обратиться с помощьюBundle
параметра.Например:
И прочитайте эти аргументы по адресу
onCreate
:Таким образом, если объект отсоединен и повторно присоединен, состояние объекта может быть сохранено с помощью аргументов, подобно тому, как
bundles
присоединено кIntent
s.источник
Если вы используете параметр для какого-то класса. попробуй это
источник
FragmentManager
, вы потеряете mSomeInstance.Я думаю, что нет никакой разницы между статическим конструктором и двумя конструкторами (пустым и параметризованным, который хранит аргументы в пакете аргументов фрагмента), скорее всего, это практическое правило создано, чтобы уменьшить вероятность того, что вы забудете реализовать конструктор без аргументов в Java , который неявно генерируется при наличии перегрузки.
В своих проектах я использую Kotlin и реализую фрагменты с помощью основного конструктора без аргументов и вторичного конструктора для аргументов, которые просто сохраняют их в пакет и устанавливают в качестве аргументов фрагмента, все работает отлично.
источник
Если фрагмент использует конструкторы не по умолчанию после изменения конфигурации, фрагмент потеряет все данные.
источник