Мне действительно интересно узнать, как определить (из внешнего класса), если фрагмент onCreateView() уже вызван. Я искал похожие вопросы, но не нашел их.
Например, есть fragment.isAdded() хороший индикатор?
Моя первая мысль была просто fragment.getView() != null, но я не уверен на 100%, что она будет надежной, как кажется, и я также немного неохотно ее использую (без какой-либо конкретной причины я просто стараюсь избегать недействительности чеки). Я был бы рад найти обходной путь. Предложения у меня были:
isAdded()
Возвращает true, если фрагмент в настоящее время добавлен к его активности.
Эта линия довольно неоднозначна, на мой взгляд; добавлено не прилагается, но не создано. Он может ссылаться на FragmentTransaction.add() (что семантически неправильно, потому что вы можете иметь <fragment>, застрявшую в вашем макете, без вызова add или replace).
Тем не менее, FragmentTransaction.add() документация не дает информации и не думает added -> created. Я бы сказал, нет.
IsVisible()
Возвращает true, если фрагмент в настоящее время отображается пользователю. Это означает, что он: (1) был добавлен, (2) имеет вид, прикрепленный к окну, и (3) не скрыт.
Выглядит хорошо, в том смысле, что isVisible() -> isCreated, но третий вариант делает его isCreated != isVisible. Я просто думаю о фрагментах внутри пейджера представления: не все видимы, но фрагменты рядом с видимым в данный момент фрагментом добавляются, создаются и живы, вы можете вызывать методы на них. Но для них isVisible() == false. Это слишком строго.
isInLayout()
Возвращает true, если макет включен как часть вида активности иерархии через < фрагмент > . Это всегда будет верно, когда фрагменты создаются посредством < фрагмент > , за исключением случая где старый фрагмент восстанавливается из предыдущего состояния, и он делает не отображаются в макете текущего состояния.
Я не думаю, что это применимо здесь.
getView()!= null
Возвраты Корневой вид фрагмента, или null, если он не имеет макета.
Это все еще выглядит единственно возможным решением. Я просто хотел бы подтвердить это.
Внедрить обратный вызов
.. называться onCreateView() или, лучше, onViewCreated(). Но:
- Мне не нужно вызывать что-то, как только будет создан фрагмент (зачем вам это нужно?), мне нужно что-то проверить в данный момент;
- Следует определить противоположное, скажем, onViewNotAvailableAnymore(), чтобы сделать проверку значимой в любое время;
- Я не вижу, как это было бы иначе или лучше, чем
getView != null.