В чем принципиальная разница между этими двумя методами? Должен ли я использовать один элемент поверх другого для повышения производительности при создании 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);
}
Ответы:
Мы сталкиваемся с некоторыми сбоями при инициализации представления в
onCreateView
.Потому что иногда представление не инициализируется должным образом. Поэтому всегда используйте
findViewById
inonViewCreated
(когда представление полностью создано), и оно также передает представление как параметр.onViewCreated
Убедитесь, что представление полностью создано.Вызывается сразу после возврата
onCreateView
(android.view.LayoutInflater, android.view.ViewGroup
,android.os.Bundle
), но до восстановления какого-либо сохраненного состояния в представлении. Это дает подклассам возможность инициализировать себя, как только они узнают, что их иерархия представлений полностью создана. Однако на этом этапе иерархия представления фрагмента не привязана к его родительскому элементу.источник
post
(...), чтобы дождаться его отображения. Возможно сделает findViewById и прочую инициализацию вonViewCreated
.onViewCreated
вызывается сразу послеonCreateView
(метода, который вы инициализируете и создаете все свои объекты, включая вашTextView
), так что это не вопрос производительности.С сайта разработчика:
Источник: Фрагмент # onViewCreated
источник
Любое присвоение подвидов полям в
onViewCreated
. Это связано с тем, что фреймворк выполняет автоматическую нулевую проверку, чтобы убедиться, что иерархия представления вашего фрагмента была создана и увеличена (при использовании файла макета XML) должным образом.Фрагмент кода из: FragmentManger.java
источник
onCreateView
используется для создания иерархии представлений фрагмента. Это может быть через расширение XML или динамическое создание (т. Е. Создание представлений Java программным способом). Так что можно вообще не звонитьinflate
. Но вы должны вернуть какое-то родительское представление, если фрагмент должен иметь элемент пользовательского интерфейса. В противном случае вернитесьnull
.FragmentManager
код фрагмента и дляperformCreateView
, который вызываетonCreateView
github.com/android/platform_frameworks_base/blob/… , вам гарантировано несколько вещей дляonViewCreated
обратного вызова жизненного цикла:onCreateView
возвращает увеличенный вид.OnViewCreated
вызывается сразу послеonCreateView
и имеет параметр inflated view. Его возвращаемый типvoid
источник
getView
звонкаonCreateView()
является эквивалентом фрагментаonCreate()
для Activity и запускается во время создания представления.onViewCreated()
запускается после создания представления.should I use one over the other for performance?
Нет . Нет никаких свидетельств повышения производительности.Во
onCreate()
Фрагментах тоже есть метод, но он используется редко (я никогда не использую его и не нахожу для него подходящего варианта).Я всегда использую
onCreateView()
фрагменты в качестве заменыonCreate()
.И я доволен этим.
источник
onCreateView
это эквивалент ActivityonCreate
.onCreate()
во Framents тоже есть метод. Но он никогда не использовался (или, по крайней мере, я им никогда не пользуюсь). Я всегда используюonCreateView()
фрагменты в качестве замены.Документы на
Fragment.onCreateView()
данный момент говорят:Нам не нужно понимать почему; нам просто нужно делать то, что написано в документации, но было бы интересно узнать, почему существует эта рекомендация. Мое лучшее предположение - разделение проблем , но ИМХО это делает его немного сложнее, чем должно быть.
источник
setContentView()
inonCreate()
?Основная причина, по которой я бы использовал,
onViewCreated
заключается в том, что она отделяет любую логику инициализации от логики инфляции / создания иерархии представлений, которая должна идти вonViewCreate
. Все остальные характеристики выглядят так же.источник
Я думаю, что основное различие между ними заключается в том, что вы используете kotlin.in onCreateView () каждый раз, когда вы хотите получить доступ к просмотру в своем XML-файле, вы должны использовать findViewById, но в onViewCreated вы можете просто получить доступ к своему представлению, просто вызвав его идентификатор ,
источник
onCreateView используется во фрагменте для создания макета и расширения представления. onViewCreated используется для ссылки на представление, созданное указанным выше методом. Наконец, рекомендуется определить слушателя действий в onActivityCreated.
источник