Подтвердить что ты не робот

Как я могу узнать, что 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.
4b9b3361

Ответ 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() был вызван).