Как я могу узнать, что onCreateView был вызван из внешнего класса?
Мне действительно интересно узнать, как определить (из внешнего класса), если фрагмент 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
.
Ответы
Ответ 1
Полагая
- вас не интересует, видна ли
Fragment
- вы хотите знать, только если метод
onCreateView(...)
был вызван инфраструктурой Android
- вам нужно использовать существующие API-интерфейсы фрагментов, чтобы узнать
затем используйте
getView() != null
при условии, что вы раздуваете макет и возвращаете View
внутри onCreateView(...)
.
Подход, не относящийся к фрагментам API, заключается в добавлении обратного вызова в onCreate(...)
, который затем вызывается в onCreateView()
или позже (в жизненном цикле).
Ответ 2
Имеет ли Fragment.isAdded() подразумеваемое, что onCreateView был вызван?
НЕТ!! НЕТ!! пауза NOOOOOOO00000000000!!!!!
SIR
Fragment.isAdded()
- это уведомление о том, что ваш Fragment
был добавлен в ваш Activity
, конец истории.
Метод add()
в FragmentTransaction
имеет 3 разных метода: все добавляет Fragment
к Activity
, и два идут дальше, чтобы создать ваш Fragment
View
и прикрепить его к Parent
ViewGroup
с помощью LayoutInflater
, если ваш первый параметр не 0 (id != 0)
Чтобы проверить, был ли вызов onCreateView()
, вам необходимо переопределить onViewCreated()
.
getView()
всегда будет возвращать значение null, если не выполнено onCreateView()
ваше решение - проверка Fragment.isVisible()
FYI: Нет ничего плохого в том, что я вижу с документацией. Его довольно ясный сэр.
Надеюсь, что я уверен, сэр
Ответ 3
Это можно сделать с помощью интерфейса. сделать интерфейс OnCreateViewListerner
public interface OnViewCreatedListener
{
void onCreateCalled();
}
создать статический объект OnViewCreatedListener в вашем фрагменте и инициализировать его внутри вашего класса Outer и класса Outer реализовать этот интерфейс, например
public class CustomClass implements OnViewCreatedListener{
@Override
public void onCreateCalled() {
}
public void initializeInterface()
{
FragmentTest.listerner = this;
}
.....
}
затем переопределите метод onCreateView() и напишите это
public class FragmentTest extends Fragment{
public static OnViewCreatedListener listerner;
View mView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// if (container == null)
if(listerner!= null)
{
listerner.onCreateCalled();
}
mView = inflater.inflate(R.layout.fragment_product, container, false);
return mView;
}
}
Надеюсь, это поможет вам.
Ответ 4
Пожалуйста, рассмотрите этот подход, как я сделал это следующим образом:
Определите Interface
в своем фрагменте:
public Interface IDoSomething{
void intimateAfterOnCreateView();
}
Теперь вызовите этот метод с помощью onStart()
фрагмента, так как согласно жизненному циклу этот метод будет вызываться после onCreateView()
.
Вне этого фрагмента просто реализуйте IDoSomething, и вы получите метод переопределения (intimateAfterOnCreateView()
) автоматически.
Теперь это выполнение метода покажет, что был вызван onCreateView()
.
Я просто хочу поделиться своими знаниями, может быть, это помогает.
Ответ 5
Если isAdded()
на фрагменте возвращает true, это не значит, что был вызван onCreateView()
. Фактически, isAdded возвращает true даже во время обратного вызова onAttach, который вызывается перед onCreate().
Ответ 6
Я бы продолжил расширение класса Fragment и добавление общедоступного метода, который вы можете использовать для внешнего доступа вашего пользовательского класса фрагментов.
Когда вызывается onCreateView()
, вы можете установить логическое значение true, и в соответствии с вашей архитектурой вы можете снова установить его на false, когда оно onPause()
или onStop()
или onDestroyView()
или onDestroy()
или onDetach()
, до вас.
Я не думаю, что методы, которые вы упомянули в своем вопросе, предоставят вам именно то, что вам нужно.
Ответ 7
Как я могу узнать, что onCreateView был вызван из внешнего класса?
Вам необходимо создать интерфейс внутри вашего фрагмента и реализовать его в активности контейнера (скажем, MainActivity).
1. Сначала создайте интерфейс внутри вашего фрагмента:
// Container activity must implement this interface
public interface OnCreateViewCalledListener {
void OnCreateViewCalled(String someData);
}
2. Затем выполните интерфейс внутри вашей активности в контейнере (скажем, это MainActivity) и вызовите его:
public class MainActivity extends AppCompatActivity implements
YourFragment.OnCreateViewCalledListener {
...
@Override
public void OnCreateViewCalled(String someData) {
Toast.makeText(MainActivity.this, "OnCreateView was called and passed " + someData)
}
3. Затем вам нужно проверить, реализует ли MainActivity обратные вызовы интерфейса (этот шаг имеет решающее значение для обеспечения правильной работы):
//Using onAttach method to check that activity has implemented callbacks
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Make sure that container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnCreateViewCalledListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnCreateViewCalledListener");
}
}
4. И, наконец, вам нужно вызвать обратный вызов внутри onCreateView:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mCallback.OnCreateViewCalled("Some useful data");
...
}
Что это!
ИЗМЕНИТЬ
Чтобы другой класс знал, что вызывается onCreateView, используйте обратный вызов onCreateViewCalled() внутри MainActivity (например, используйте другой интерфейс для запуска обратного вызова в другом классе).
Также не обязательно передавать данные в OnCreateViewCalled()
Ответ 8
Имеет ли Fragment.isAdded() подразумеваемое, что onCreateView был вызван?
Да
isAdded() Возвращает true, если фрагмент в настоящее время добавлен к его активности. (Неявно onCreateView()
был вызван).