¿Cómo puedo saber que onCreateView ha sido llamado desde una clase externa?

Estoy realmente curioso acerca de cómo determinar (de una clase externa) si un fragmento onCreateView() ya ha sido llamado. He buscado preguntas similares pero no encontré ninguna.

Por ejemplo, ¿es fragment.isAdded() un buen indicador?

Mi primer pensamiento fue simplemente fragment.getView() != null , pero no estoy 100% seguro de que sería confiable como parece, y también estoy un poco reacio a usarlo (sin motivo en particular, sólo tienden a Evitar los controles de nulidad). Estaría encantado de encontrar una solución. Sugerencias que tuve:

está agregado()

Devuelve true si el fragmento se agrega actualmente a su actividad.

Esta línea es bastante ambigua en mi opinión; Añadido no está adjuntado , pero tampoco creado . Puede referirse a FragmentTransaction.add() (que es semánticamente incorrecto porque puede tener <fragment> s pegado en su diseño sin tener que llamar a add o replace ).

Aún así, la documentación de FragmentTransaction.add() no da información ni te hace pensar added -> created . Yo diría que no.

es visible()

Devuelve true si el fragmento está visible para el usuario. Esto significa que: (1) se ha añadido, (2) tiene su vista adjunta a la ventana, y (3) no está oculto.

Se ve bien, en el sentido de que isVisible() -> isCreated , pero la tercera opción hace que isCreated != isVisible . Sólo pienso en fragmentos dentro de un paginador de vista: no todos son visibles, pero los fragmentos cerca del fragmento actualmente visible se añaden, creados y vivos, puede llamar a métodos en ellos. Pero para ellos, isVisible() == false . Esto es demasiado estricto.

IsInLayout ()

Devuelve true si el diseño se incluye como parte de una jerarquía de vista de actividad mediante la etiqueta <fragment>. Esto siempre será cierto cuando se crean fragmentos a través de la etiqueta <fragment>, excepto en el caso en que un fragmento antiguo se restaure de un estado anterior y no aparezca en el diseño del estado actual.

No creo que esto se aplique aquí.

GetView ()! = Null

Devuelve la vista raíz del fragmento, o null si no tiene diseño.

Esto sigue siendo la única solución. Me gustaría una confirmación de eso.

Implementar una devolución de llamada

.. ser llamado onCreateView() o, mejor, onViewCreated() . Pero:

  • No necesito llamar a algo tan pronto como se crea el fragmento (¿por qué lo necesitas?), Necesito algo que comprobar en un momento dado;
  • Uno debe definir lo contrario, por ejemplo, onViewNotAvailableAnymore (), para hacer el cheque significativo en todo momento;
  • No veo cómo esto sería diferente, o mejor, que getView != null .

Asumiendo

  • Usted no está interesado en si el Fragment es visible
  • Sólo desea saber si el onCreateView(...) ha sido llamado por el framework de Android
  • Es necesario utilizar los métodos de API de fragmentos existentes para averiguar

Entonces usa

 getView() != null 

Siempre que infle el diseño y devuelva la View dentro onCreateView(...) .

Una aproximación no Fragment-API es agregar una devolución de llamada en onCreate(...) , a la que luego llama en onCreateView() o en un método posterior (en ciclo de vida).

¿Fragment.isAdded () implica que onCreateView ha sido llamado?

NO !! NO !! Pausa NOOOOOOO00000000000 !!!!!

Señor

Fragment.isAdded() es una notificación de que tu Fragment se ha agregado a tu Activity , al final de la historia.

El método add() en FragmentTransaction tiene 3 métodos diferentes, todo agrega Fragment a una Activity , y, dos va más allá para crear su vista de Fragment y adjuntarla a un ViewGroup de ViewGroup con la ayuda de LayoutInflater siempre que su primer parámetro no sea 0 (id != 0)

Para comprobar si onCreateView() ha sido llamado necesita anular onViewCreated() .

getView() siempre devolverá null a menos que onCreateView() se haga

Su solución es check Fragment.isVisible()

FYI: No hay nada malo que veo con la documentación. Es bastante claro señor.

Espero que esté lúcido, señor

Se puede hacer usando la interfaz. Hacer una interfaz OnCreateViewListerner

 public interface OnViewCreatedListener { void onCreateCalled(); } 

Crear un objeto estático de OnViewCreatedListener en su Fragmento e inicializarlo dentro de su clase externa y la clase externa implementar esta interfaz como

  public class CustomClass implements OnViewCreatedListener{ @Override public void onCreateCalled() { } public void initializeInterface() { FragmentTest.listerner = this; } ..... } 

Entonces sobreescriba su método onCreateView () y escriba esto

 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; } } 

Espero que esto te ayudará.

Por favor considere este enfoque como lo hice igual que esto:

Defina una Interface con en su fragmento decir:

 public Interface IDoSomething{ void intimateAfterOnCreateView(); } 

Ahora, llame a este método con en onStart() de un fragmento de acuerdo con el ciclo de vida de este método se llamará después de la onCreateView() . Fuera de este fragmento sólo implementar IDoSomething y obtendrá un método overrided ( intimateAfterOnCreateView() ) automáticamente.

Ahora la ejecución de este método mostrará que onCreateView() ha sido llamado.

Sólo quiero compartir mi conocimiento, puede ser que ayuda.

Si isAdded() en un Fragment devuelve true, no significa que onCreateView() ha sido llamado. De hecho, isAdded devuelve true incluso durante la devolución de llamada onAttach, que se llama antes de la onCreate ().

Yo iría con la extensión de la clase Fragment y la adición de un método público que puede utilizar para llegar desde el exterior de su clase de fragmento personalizado.

Cuando se llama a onCreateView() , puede establecer un valor booleano en true y de acuerdo con su arquitectura, puede volver a ponerlo en false cuando está en onPause() o onStop() o onDestroyView() o onDestroy() o onDetach() , Depende de usted.

No creo que los métodos que mencionó en su pregunta le proporcionarán exactamente lo que necesita.

¿Cómo puedo saber que onCreateView ha sido llamado desde una clase externa?

Necesitas crear la interfaz dentro de tu fragmento e implementarla en la actividad del contenedor (digamos MainActivity).

1. Primero crea una interfaz dentro de tu fragmento:

 // Container activity must implement this interface public interface OnCreateViewCalledListener { void OnCreateViewCalled(String someData); } 

2. A continuación, implementar la interfaz dentro de su actividad contenedor (vamos a decir que es MainActivity) y llamar a su método:

 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. A continuación, debe comprobar si MainActivity implementa las devoluciones de llamada de la interfaz (este paso es crucial para que funcione correctamente):

 //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. Y finalmente necesita activar la devolución de llamada dentro de onCreateView:

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mCallback.OnCreateViewCalled("Some useful data"); ... } 

¡Eso es!

EDIT :

Para que otras clases sepan que se llamó onCreateView, utilice la devolución de llamada onCreateViewCalled () dentro de MainActivity (por ejemplo, utilice otra interfaz para activar la devolución de llamada en otra clase). También no es obligatorio pasar datos en el OnCreateViewCalled ()

¿Fragment.isAdded () implica que onCreateView ha sido llamado?

IsAdded () Devuelve true si el fragmento se agrega actualmente a su actividad. (Implicitamente onCreateView() ha sido llamado).

  • Mide la vista en el fragmento
  • ¿Cómo detectar los cambios de orientación pero dejar que el android los maneje?
  • ¿Cuándo puedo primero medir una vista?
  • Cómo recuperar el paquete onSaveInstanceState () en onResume ()?
  • Actividad y Fragmento Ciclos de Vida y Cambios de Orientación
  • OnActivityCreated siempre se llama?
  • View.getContext devuelve null, ¿por qué?
  • Distinguir entre presionar el botón "inicio" y abrir otra Actividad
  • OnCreate () vs OnStart ()
  • Realizar una pausa de actividad que no se reanuda después de volver a crear el método
  • Cómo manejar AsyncTask onPostExecute cuando se pausan para evitar IllegalStateException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.