Video: Tutorial 17: Como usar fragments en Android 2024
La interfaz de usuario en el ejemplo de la aplicación de Android tiene tres paneles: una lista de elementos, un panel de detalles que describe el elemento seleccionado en la lista y un panel de detalles en profundidad. En una pequeña pantalla de teléfono inteligente, cada panel puede ser una actividad separada. Pero una pantalla de tableta en modo horizontal tiene espacio para más de un panel.
La siguiente imagen muestra esta aplicación con dos de los tres paneles. El panel de la izquierda muestra una lista de componentes de Android SDK. El panel de la derecha muestra una descripción de cualquier componente que se elija en la lista de la izquierda. (La descripción es en realidad las primeras oraciones de la documentación del SDK del componente). Este patrón de detalles sobre la derecha es parte de muchas interfaces de usuario.
Para crear la pantalla, construyes una actividad. La actividad tiene dos fragmentos: un fragmento a la izquierda y otro a la derecha. El panel izquierdo muestra el mismo fragmento a lo largo de la ejecución de la aplicación, por lo que puede declarar ese fragmento en el archivo de diseño de la actividad. El panel derecho muestra un fragmento a la vez, pero el fragmento cambia durante la ejecución de la aplicación. Entonces declaras un diseño de marco en el panel derecho.
En el código anterior, los atributos android: layout_ whatever dividen la pantalla en dos mitades: una mitad para el elemento fragmento y la otra mitad para el elemento FrameLayout. La estrategia con estos atributos es comenzar asignando un mínimo de cero píxeles para cada elemento. Por supuesto, cero píxeles significa ningún ancho en absoluto (que es lo mismo que ser invisible). Para evitar que las dos mitades del diseño sean invisibles, asigne valores iguales a cero de layout_weight a las dos mitades. Con valores de peso distintos de cero, cada mitad se expande para llenar el espacio disponible en el diseño.
El uso del nombre de clase completo del fragmento (com. Allmycode. Frag. ComponentNamesFragment) es intencional. Un nombre abreviado (como. ComponentNamesFragment) no cortará la mostaza.
En caso de que te lo estés preguntando, los detalles incorporados de AndroidElementBackground proporcionan un aspecto uniforme para cosas como la mitad derecha (elementos que muestran detalles sobre un elemento que el usuario ha seleccionado).
El código de actividad principal de la aplicación es impresionantemente poco interesante.
paquete com. allmycode. frag; Importar Android. aplicación Actividad; Importar Android. os. Haz; la clase pública AllPurposeActivity extiende la actividad {@Override protected void onCreate (Bundle savedInstanceState) {super. onCreate (savedInstanceState); setContentView (R.diseño. main);}}
El siguiente código contiene la clase ComponentNamesFragment. En virtud del diseño en el primer ejemplo, Android planta un ComponentNamesFragment en el lado izquierdo de la pantalla del dispositivo.
paquete com. allmycode. frag; Importar Android. aplicación FragmentManager; Importar Android. aplicación FragmentTransaction; Importar Android. aplicación ListFragment; Importar Android. os. Haz; Importar Android. ver. Ver; Importar Android. widget. ArrayAdapter; Importar Android. widget. Vista de la lista; public class ComponentNamesFragment extends ListFragment {final static String [] COMPONENTS = {"Activity", "Service", "BroadcastReceiver", "ContentProvider"}; @Override public void onActivityCreated (Bundle savedInstanceState) {super. onActivityCreated (savedInstanceState); setListAdapter (nuevo ArrayAdapter (getActivity (), android. R. layout. simple_list_item_1, COMPONENTS));} @Override public void onListItemClick (ListView l, View v, int index, long id) {// Crear fragmento con índice DocsFragment docsFragment = nuevo DocsFragment (); Bundle args = Ayudante. getBundleWithIndex (index); docsFragment. setArguments (args); // Borrar la pila posterior FragmentManager fragmentManager = getFragmentManager (); int backStackEntryCount = fragmentManager. getBackStackEntryCount (); for (int i = 0; iLa clase del código anterior amplía la clase ListFragment de Android. Un ListFragment es un fragmento que muestra una lista. Al principio del ciclo de vida del fragmento, el código en el ejemplo anterior establece un adaptador de lista (más específicamente, un ArrayAdapter) para el fragmento. Entonces, ¿qué tan temprano es "temprano"?
El primer parámetro del constructor ArrayAdapter es un contexto. ¡Pero espera! A diferencia de una actividad, un fragmento no es un contexto. Por lo tanto, no puede usar la palabra clave this para el primer parámetro del constructor ArrayAdapter.
Afortunadamente, un fragmento tiene un método getActivity. Una llamada a getActivity toma la actividad a la que está adjuntado el fragmento. Entonces, para el primer parámetro del constructor ArrayAdapter, puede llamar a getActivity. Por supuesto, no puede llamar a getActivity hasta que el fragmento esté adjunto a una actividad existente. Es por eso que el método onActivityCreated del fragmento se reemplaza arriba. Android llama aActivityCreated después de adjuntar el fragmento y llamar al método onCreate de la actividad. Entonces todo funciona según lo planeado.
El android. aplicación La clase de bisabuelos de la clase de actividad es android. contenido. Contexto. Pero el android. aplicación La clase de padres de la clase Fragment es simple y antigua Java. lang. Objeto. Por lo tanto, en el código de una actividad, la palabra clave esto se refiere a un contexto. Pero en el código de un fragmento, la palabra clave esto no se refiere a un contexto.
En el ejemplo anterior, el constructor para ArrayAdapter tiene tres parámetros.
El primer parámetro es el contexto, ese desagradable parámetro que te obliga a poner el constructor dentro del método onActivityCreated.
El segundo parámetro es simple_list_item_1: un diseño estándar de Android.
El diseño simple_list_item_ 1 crea el aspecto que ve en el lado izquierdo de la imagen. Android tiene muchos de estos diseños estándar. Para obtener un resumen de los diseños disponibles, visite el sitio para desarrolladores de Android.
El tercer parámetro es la colección de elementos que aparecerán en la lista.
En este ejemplo, esos elementos provienen de la matriz de COMPONENTES, que se declara en el mismo ejemplo.
Como una ListActivity, un ListFragment tiene un método onListItemClick. Puede responder a un clic al trabajar con un FragmentTransaction, un FragmentTransaction y un FragmentManager:
DocsFragment representa el lado derecho de la imagen de arriba.
Una transacción de fragmento es un montón de cosas que haces con fragmentos. Por ejemplo, configurar para reemplazar un fragmento por otro es una transacción.
Un administrador de fragmentos hace lo que sugiere su nombre. Gestiona las llegadas y salidas de fragmentos.