Это может показаться глупым вопросом, но в чем разница между getArguments Bundle и Bundle, полученными в onCreate?
Android - В чем разница между getArguments и Bundle, полученными в onCreate
Ответ 1
TL; ДР:
Fragment.getArguments() предназначен для создания Фрагмента.
onCreate (Bundle) предназначен для извлечения пакета из предыдущего экземпляра.
Подробнее:
Я прочесывал веб для этого и спросил опытного разработчика Android, поэтому здесь приличное объяснение:
Пакет, переданный как параметр в функции onCreate, предназначен для, если был предыдущий экземпляр фрагмента, который обновляется при вызове функции onSaveInstanceState. (Подробнее об этом вы можете прочитать в официальных документах: https://developer.android.com/training/basics/activity-lifecycle/recreating.html)
Однако функция Fragment.getArguments() используется при первоначальном создании фрагмента. Вы впервые перейдете к фрагменту, и предыдущий экземпляр этого фрагмента не будет существовать. В этом случае вы можете установить локальные переменные внутри вашего фрагмента, которые были разделены с помощью функций setArguments() и getArguments(). (Подробнее об этом здесь: https://developer.android.com/reference/android/app/Fragment.html)
Поэтому: Надежный код может выглядеть так:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
super.onCreateView(inflater, container, savedInstanceState);
mView = inflater.inflate(R.layout.fragment_name, container, false);
mContext = getActivity();
if(savedInstanceState != null){
Log.d("yourapp", "A SavedInstanceState exists, using past values");
mValue = savedInstanceState.getString("valueString");
}else{
Log.d("yourapp", "A SavedInstanceState doesn't exist");
Bundle bundle = getArguments();
mValue = bundle.getString("valueString");
}
}
который обрабатывает оба случая в вашем состоянии onCreate.
Надеюсь, это поможет!
Ответ 2
Связывание, полученное в onCreate, содержит данные, которые он последний раз подавал, если воссоздана активность, а getArguments Bundle возвращает пакет, который был предоставлен как аргумент.
Ответ 3
Набор аргументов, используемый для создания фрагмента и после его установки, не может быть установлен снова. Пакет в onCreate/onCreateView/onActivityCreated/onViewStateRestored является сохраненнымInstanceState. Вы можете использовать это, чтобы получить сохраненные значения, которые вы сохраняете с помощью переопределений onSaveInstanceState
. При создании фрагмента пакет savedInstanceState обычно имеет значение null, поэтому вы можете использовать getArguments.
Еще одна вещь о getArguments, вам не нужно сохранять эти значения. Они будут восстановлены для вас с помощью фрагмента кода. Если вы попытаетесь установить атрибуты на фрагмент, который уже есть, вы столкнетесь с IllegalStateException
Ответ 4
Я хотел бы добавить к ответу N15M0_jk.
Иногда нет необходимости сохранять состояние фрагмента (для статических фрагментов), и вы можете использовать только getArguments()
для повторного создания, поскольку аргументы, установленные с помощью setArguments()
, сохраняются даже после уничтожения.
См. ссылку на setArguments()