OnCreateView() не вызывается сразу после FragmentTransaction.commit()

У меня есть активность, где я динамически заменяю фрагменты:

private void goToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

Теперь я хочу получить доступ к представлениям внутри фрагмента, чтобы я мог поместить в него данные (которые я сохранил в своей деятельности) сразу после вызова goToFragment.

Проблема в том, что фрагмент onCreateView не вызывается до того, как фрагмент будет полностью отрисован, по крайней мере, до моего понимания.

Я знаю, что переопределение onAttach(Activity activity) во фрагменте - это один из способов его решения, но затем я должен его конкретно указать на свою активность - и я просто хочу этого избежать, потому что считаю, что это плохая практика для фрагмента зависит от конкретной деятельности.

Насколько я понимаю, Fragment не имеет прослушивателей (как объекта).

Итак, я полагаю, что должен сделать свой собственный слушатель (используя Pattern наблюдателя, чтобы сделать фрагмент объектом и активным наблюдателем), а затем вызывать его всякий раз, когда выполняются onCreateView или onAttach, а затем, наконец, обращается к фрагменту с данными, которые необходимо установить. Тем не менее, мне нужно сделать это для нескольких фрагментов, поэтому я должен был бы сделать слушатель для каждого фрагмента, который я снова считаю плохим.

Есть ли лучший/более простой способ сделать это?

Ответы

Ответ 1

FragmentTransaction не применяется сразу после вызова commit(). Вы можете принудительно обновить вручную:

...
mFragmentManager.executePendingTransactions();

Назначение вызовов AFAIK-события - это пользовательская связь с Fragment за пределами обычного жизненного цикла.

Ответ 2

Правильный способ сделать это - определить интерфейс для классов Activity, желающих отобразить ваш Fragment. Таким образом, на onAttach вы не перейдете к определенному Activity, а к вашему интерфейсу.

См. например: http://developer.android.com/guide/topics/fundamentals/fragments.html#EventCallbacks

Ответ 3

Вы должны использовать onActivityCreated для установки значений.

Задайте ссылки в onCreateView, а затем установите для них значения в onActivityCreated.