Esta pregunta es no acerca de cómo detectar si la vista está conectado o desconectado.

En general, cuando es una vista conectado o desconectado? Hay un ciclo de vida diagrama para esto?

Para aclarar, estoy buscando respuestas a lo que sucede cuando: Actividad enviada a fondo, vista opaca colocado en la parte superior, la visibilidad del conjunto a GONE, ver inflados, de padres separados, etc. Esta no es una lista exhaustiva – sólo quiero entender cómo colocar y retirar de las vistas de las obras, en un nivel fundamental.

Actualización con más ejemplos de lo que estoy tratando de conseguir en:

Lo que sobre los fragmentos vs actividades?

¿Qué acerca de las vistas anidadas – ¿en qué orden son vistas conectado/desconectado (padre->niño o niño->el padre)?

Son puntos de vista medido antes de que se adjunta o después?

¿Qué acerca del uso addView() a un ViewGroup manualmente?

Edit: Resumen:

  • Para las Actividades, las opiniones están conectados en setContentView(). Las vistas son separados en onDestroy() o cuando setContentView() se llama con un punto de vista diferente.
  • De los Fragmentos, las vistas se adjunta después de onViewCreated() acabados, y se separan después de onDestroyView() acabados.
  • Para ViewGroups, las vistas se adjunta en addView() y separados en removeView()
  • setVisibility() no afecta el adjunto estado de una vista
InformationsquelleAutor William | 2015-03-12

1 Comentario

  1. 38

    De la documentación oficial:

    Una actividad es una sola, centrado cosa que el usuario puede hacer. Casi
    todas las actividades de interactuar con el usuario…

    La primera cosa que hay que señalar es que no es una obligación para las actividades que se asocia con un diseño. Usted puede tener una actividad sin interfaz de usuario (y por tanto, no Vista). Android incluso especifica una interfaz de usuario no tema para esto.

    De pasar a su pregunta – a Ver se une a una Actividad en el momento de llamar a setContentView(ver). Esto se suele llamar en el onCreate() método. La razón por la que suelen tener este en el onCreate (), el método es debido a que la mayoría de la inicialización se realiza allí. Y cómo podría inicializar los controles si la vista no ha sido inflados y que se adjunta a la Actividad? Por lo tanto, si usted tiene una vista, casi invariable al final llama a setContentView() en el interior de su onCreate() método anterior a todos los demás de la inicialización.

    Pero eso no significa que la vista (si existe) debe estar ligado a la
    la actividad sólo en el onCreate() método?

    Para responder a esta pregunta, vamos a ver lo que el ciclo de vida de una Actividad que parece. Inicie su aplicación:

    onCreate() -> onStart() -> onResume() //son llamados de forma consecutiva

    El escenario está ahora en es donde todos los widgets han sido inicializado.

    Así que ¿por qué no se inflan y adjuntar la actividad en onResume() y hacer todos los
    inicializaciones no?

    Por supuesto, usted podría. Pero imagínese lo que sucede cuando un cuadro de diálogo (parcialmente la vista opaca) muestra? La Actividad se encuentra parcialmente cubierta y se encuentra en el fondo. El onPause() llama al método. El diseño está todavía unido a la Actividad en este punto. Toma un poco de acción y cierre el cuadro de diálogo. onResume() se llama. El diseño se infla de nuevo. Todas las inicializaciones iba a suceder de nuevo y usted podría perder su estado. Incluso si usted no tiene mucho en el camino de la inicialización, usted todavía podría estar haciendo bastante caro llamada llamando onCreate() de nuevo. Y usted quiere evitar este de los recursos limitados de los dispositivos móviles.

    Lo que sucede cuando un cuerpo opaco ver que sale y la Actividad se encuentra en
    el fondo, pero aún en marcha (como una llamada de teléfono o la apertura de otra actividad)?

    Ahora las siguientes devoluciones de llamada a suceder:

    onPause() -> onStop()

    Cuando vuelvas a la actividad original

    onRestart() -> onStart() -> onResume()

    Por la misma razón, como he mencionado en onPause() no desea hinchar y adjuntar una presentación aquí.

    Pero ¿qué ocurre con el diseño de la misma cuando una Actividad está en el
    de fondo. Es el diseño sigue conectado?

    Sí, mucho. Si otra actividad que se viene, que utiliza el mismo diseño de la actividad original, la nueva actividad tiene su propio diseño y no hay intercambio de diseños.

    ¿Qué sucede si el usuario finaliza la actividad presionando la parte Posterior
    botón?

    Suponiendo que el onBackPressed() es un método que no reemplaza para lograr el comportamiento personalizado (en cuyo caso, está en juego), onDestroy() es llamada y la actividad es destruido y no hay ninguna Vista asociada con él nunca más.

    ¿Qué sucede cuando la actividad es en el fondo y el Android GC
    decide destruir la actividad y recuperar los recursos?

    De acuerdo a la actividad del ciclo de vida dentro de la documentación, onDestroy() será llamado. Pero no hay ninguna garantía de ello. En este punto, la actividad y se asocia vista son simplemente basura que se recoge y no hay ninguna conexión.La próxima vez que inicie la aplicación, onCreate() será llamado como de costumbre y solo tienes que empezar desde el principio otra vez.

    ¿Qué sucede cuando me gire mi dispositivo?

    La forma en que Android funciona es en realidad destruir la actividad actual y a inflar el nuevo diseño de nuevo y empezar desde el onCreate() método. Así que lo que técnicamente ocurre es:

    onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() ->
    onResume()

    Debido a esto, usted puede incluso tener un diseño diferente y a la vista, mientras en el modo de paisaje.

    EDIT: Añadida la relación entre las actividades, los fragmentos y las vistas
    Un fragmento representa una porción (o comportamiento) en la pantalla. Un fragmento puede ser hecho para ocupar toda la pantalla o puede tener varios fragmentos dentro de una Actividad. Los fragmentos tienen su propio ciclo de vida, sino que está estrechamente vinculada a la acogida de la actividad del ciclo de vida (y más allá del alcance de esta respuesta). Ya que estamos hablando específicamente de las vistas, voy a limitar esta respuesta a dos métodos de interés:

    • onCreateView()
    • onViewCreated()

    Se llama a los métodos en el orden siguiente:

    onAttach() -> onCreate() -> onCreateView() -> onViewCreated()

    Hacer la configuración real de la inflación dentro de la onCreateView() y luego se hacen las inicializaciones dentro de la onViewCreated() método. El resultado de la onCreateView() usa el método de Android para inflar la vista.

    Así que cuando es el fragmento crea en primer lugar por la Actividad?

    Hay dos formas de mostrar fragmentos de uno es ponerlos en el xml de diseño de la actividad (como cualquier otro widget, donde en vez de el nombre del widget, usted va a utilizar el nombre completo del paquete del fragmento de la clase) o se puede hacer mediante la adición FragmentManager programación (que es el método preferido).

    Si estaban definiendo el fragmento dentro del xml de diseño, usted debe saber que el fragmento no puede ser eliminado mediante programación. Sería difícil modificar esta y reutilizar el espacio de pantalla de otros fragmentos. También en este caso, a la vista está conectado y vinculado a la actividad. En este caso, usted va a inflar el xml del layout de la Actividad en el onCreate() método de la actividad. Así que ahora, el flujo se ve algo como:

    onCreate() [Actividad] -> onAttach() [Fragmento] -> onCreate()
    [Fragmento] -> onCreateView() [Fragmento] -> onViewCreated() [Fragmento]
    -> onStart() [Actividad] -> onResume() [Actividad] -> onActivityCreated() [Fragmento]

    Así que primero el fragmento de vista es instanciado y adjunto el fragmento antes de la onStart() método de la actividad es creada.

    Si el fragmento se agrega mediante programación, si se añade en el onCreate() método, entonces se sigue el mismo flujo. Se puede empezar en cualquier lugar. Usted simplemente tiene que sustituir el ciclo de vida del fragmento dentro de la actividad en el lugar apropiado. Al agregar fragmentos de programación, mientras que el fragmento está alojado en la actividad, a la vista está conectado a la actividad. Cuando el fragmento se retira de la actividad, onDetach() es llamada y la vista ya no es una parte de la Actividad. Los recursos tomadas por el fragmento puede ser liberado.

    Lo que acerca de las Vistas Anidadas, Anidada Fragmentos, etc.?

    En vistas anidadas, como un contenedor de diseño dentro de otra, las reglas del contenedor primario se aplican al niño contenedor. Siempre que el padre se inicializa primero. Así que para un widget dentro de un LinearLayout, el padre LinearLayout se construye primero seguido inmediatamente por el niño. Cuando la destrucción de tales puntos de vista, todo lo que pasa cuando el padre deja de existir. No he leído acerca de la documentación como a una orden en la que esto puede ocurrir. El Android GC puede tener reglas, pero no estoy seguro si están documentados en cualquier lugar.

    Puede tener anidados fragmentos demasiado – en este caso, el padre fragmento se inicializa antes de que el niño fragmento hace (y es lógico ¿no?). Cuando un padre fragmento deja de existir, el niño también dejará de existir. El niño no puede existir sin el padre, pero usted puede tener el padre sin el hijo.

    La línea de fondo para las vistas anidadas es que una vez que la vista principal es
    destruido, toma al niño de la vista de inmediato con ella.

    Son vistas medido antes de que se adjunta o después?

    Vistas son de la medida después de que se adjunta. Llamar getMeausredWidth() o getMeasuredHeight() devolverá cero antes de esto. Pero lo que puedes hacer es llamar a neasure() directamente en la vista antes de que se adjuntan y pasan MeasureSpecs (le sugiero que lea más sobre esto en el oficial docs) para establecer algunas limitaciones. Pero esta opción no es infalible, ya que depende de los padres ViewGroup cumplimiento a las propias limitaciones que tengan mayor prioridad. Simplemente para responder a su pregunta, las vistas se mide después de que se adjunta.

    Lo que sobre el uso de addView() para añadir una vista a un ViewGroup manualmente?

    Esto es simplemente la misma como vistas anidadas. El niño sólo existen cuando son agregadas y esto es controlado por el usuario. En vistas anidadas definido en el diseño de xml, los niños están inflados inmediatamente después de su padre. Aquí el control es más en las manos del usuario. Cuando la vista principal en este caso es destruido, toma al niño ver con ella.

    Como último punto, también me gustaría mencionar que no se debe utilizar identificadores estáticos para las vistas ya que esto llevaría a un montón de dolores de cabeza con la ruptura de las vistas.

    • Gracias, tu respuesta es útil para las actividades, pero quiero saber más de eso. ¿Qué acerca de los fragmentos? ¿Qué acerca de las vistas anidadas – ¿en qué orden son vistas adjunto (padre->niño o niño->el padre)? Son puntos de vista medido antes de que se adjunta o después? ¿Qué acerca del uso addView() a un ViewGroup? Voy a actualizar a la pregunta con más detalles.
    • Ok.. he añadido más a la respuesta para responder a sus otras preguntas. Déjame saber si ayudó o si hay algo que usted quiere ser tratado.
    • Gran respuesta, gracias. La única pregunta que me gustaría tener es el de la visibilidad de cambiar, pero de su respuesta se ve como la visibilidad de los cambios no afectan
    • Eso es correcto. Cambiar la visibilidad no elimina el elemento en sí.

Dejar respuesta

Please enter your comment!
Please enter your name here