15

Вопрос по android – 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 не реализовано никаких слушателей (как предмет).

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

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

Как насчетFragmentManager.executePendingTransactions()?

от Andrey Ermakov

Чтобы передать данные новым фрагментам, вы можете использовать аргументы:Bundle args = new Bundle; /* store any data */ newFragment.setArguments(args);

от The Vee

Работало отлично! Добавьте ответ, и я отмечу его как принятый ответ.

от Aske B.
3 ответа
2

Вы должны использовать

onActivityCreated установить значения.

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

4

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

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

Error: User Rate Limit ExceededFragmentвнутренние органы

от 

Error: User Rate Limit Exceeded

от 

Error: User Rate Limit Exceeded

от Aske B.
37

... mFragmentManager.executePendingTransactions();

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

AFAIK обратные вызовы событий & apos; целью является индивидуальное общение сFragment за пределы обычного жизненного цикла.

Это полезно, если вы передаете данные во фрагменты. Если фрагменты используются только один раз, используйте фрагмент.setArguments (Bundle args), но если вы собираетесь повторно использовать фрагменты, это приводит к ошибкам, так что executePendingTransactions () пригодится, чтобы вы могли сразу вызвать методы / установщики для фрагмента , Хотя это не кажется слишком элегантным.

от 

Похожие вопросы