Разница между onCreateView и onViewCreated in Fragment
Какое существенное различие между этими двумя методами? Когда я создаю TextView, должен ли я использовать один над другим для производительности?
Изменить:
Какая разница от
onCreateView() {
root = some view
View v = new View(some context);
root.add(v);
return root;
}
onViewCreated() {
View v = new View(some context);
getView().add(v);
}
Ответы
Ответ 1
Мы сталкиваемся с некоторыми onCreateView
инициализации представления в onCreateView
.
Вы должны надуть свой макет в onCreateView
но не должны инициализировать другие представления, используя findViewById
в onCreateView
.
Потому что иногда представление не правильно инициализировано. Поэтому всегда используйте findViewById
в onViewCreated
(когда представление полностью создано), и оно также передает представление в качестве параметра.
onViewCreated
- убедитесь, что представление полностью создано.
onViewСозданная Android-документация
Вызывается сразу после onCreateView
(android.view.LayoutInflater, android.view.ViewGroup
, android.os.Bundle
), но до восстановления любого сохраненного состояния в представлении. Это дает подклассам возможность инициализировать себя, как только они узнают, что их иерархия представления полностью создана. Однако на этом этапе иерархия представления фрагмента не привязана к своему родителю.
Ответ 2
onViewCreated
вызывается сразу после onCreateView
(метод, который вы инициализируете и создаете все ваши объекты, включая ваш TextView
), так что это не вопрос производительности.
С сайта разработчика:
onViewCreated (View view, Bundle saveInstanceState)
Вызывается сразу после возврата onCreateView (LayoutInflater, ViewGroup, Bundle), но до восстановления любого сохраненного состояния в представлении. Это дает подклассам возможность инициализировать себя, как только они узнают, что их иерархия представления полностью создана. Однако на этом этапе иерархия представления фрагмента не привязана к своему родителю.
Источник: Фрагмент # onViewCreated
Ответ 3
Лучше выполнять любое задание subviews в полях в onViewCreated
. Это связано с тем, что фреймворк выполняет автоматическую проверку нуля, чтобы убедиться, что иерархия представления фрагментов была создана и завышена (если используется файл макета XML) должным образом.
Код фрагмента из: FragmentManger.java
// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);
// Null check avoids possible NPEs in onViewCreated
// It also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
f.mView.setSaveFromParentEnabled(false);
if (f.mHidden) f.mView.setVisibility(View.GONE);
f.onViewCreated(f.mView, f.mSavedFragmentState);
}
Ответ 4
onCreateView
возвращает завышенный вид. OnViewCreated
вызывается сразу после onCreateView
, а get имеет параметр завышенного представления. Его тип возврата void
Ответ 5
onCreateView()
- эквивалент фрагмента onCreate()
для операций и выполняется во время создания представления.
onViewCreated()
запускает после, представление было создано.
should I use one over the other for performance?
НЕТ. Там нет доказательств повышения производительности.
В Framents также есть метод onCreate()
.
Но он используется редко (я использую никогда), и не могу найти подходящий вариант для него).
Я всегда использую onCreateView()
в Fragments в качестве замены для onCreate()
.
И я доволен этим.
Ответ 6
onCreateView используется во фрагменте для создания макета и раздувания.
onViewCreated используется для ссылки на представление, созданное вышеуказанным методом.
Наконец, это хорошая практика, чтобы определить слушателя действий в onActivityCreated.
Ответ 7
Основная причина, по которой я буду использовать onViewCreated
, заключается в том, что она отделяет любую логику инициализации от логики инфляции/создания иерархии представления, которая должна идти в onViewCreate
. Все остальные характеристики производительности выглядят одинаково.
Ответ 8
я думаю, что основное различие между ними заключается в том, что когда вы используете kotlin.in onCreateView() каждый раз, когда вы хотите получить доступ к просмотру в своем XML файле, вы должны использовать findViewById, но в onViewCreated вы можете просто получить доступ к своему представлению, просто вызвав его идентификатор,
Ответ 9
Документы для Fragment.onCreateView()
теперь гласят:
В этом методе рекомендуется только раздувать компоновку и перемещать логику, которая работает с возвращенным представлением, в onViewCreated (View, Bundle).
Нам не нужно понимать, почему; нам просто нужно сделать, как сказано в документации, но было бы интересно узнать, почему существует эта рекомендация. Мое лучшее предположение - разделение интересов, но ИМХО это делает его немного сложнее, чем должно быть.