Android - В чем разница между getArguments и Bundle, полученными в onCreate

Это может показаться глупым вопросом, но в чем разница между getArguments Bundle и 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()