fragmentos - tec · 2019. 2. 13. · proyectos de desarrollo para dispositivos móviles fragmentos...
TRANSCRIPT
![Page 1: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/1.jpg)
Proyectos de desarrollo para dispositivos móviles
Fragmentos Android
Fragmento❖ Un fragmento es una parte de una actividad con ciclo de
vida propio.
❖ Recibe sus propios eventos.
❖ Se puede agregar o quitar mientras la actividad se está ejecutando.
❖ Se puede decir que es una "subActividad".
❖ Permiten reusar código.
![Page 2: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/2.jpg)
Una actividad, tres fragmentos
Actividad
FragmentoA
FragmentoB
FragmentoC
Diferentes pantallas❖ Los fragmentos permiten configurar la GUI dependiendo de la
pantalla en que corre la app.
![Page 3: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/3.jpg)
Ciclo de vida del fragmento
❖ Normalmente sobrescribimos los métodos del ciclo de vida:
➡ onCreate
➡ onCreateView
➡ onPause
Ejercicio
❖ Crea un proyecto nuevo:
PruebaFragmentos
❖ Selecciona el template:
Bottom Navigation Activity❖ Nombre de la actividad inicial:
Principal
![Page 4: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/4.jpg)
Revisa el proyectoRevisa el código y determina:
‣ Cómo se agrega la barra de navegación.
‣ Cómo se configuran los botones de la barra de navegación.
‣ Cómo responder a los eventos, de los botones, de la barra de navegación.
‣ Corre la app y observa el comportamiento.
‣ Agrega un nuevo botón.
Creando fragmentos❖ Crea un fragmento para la
opción de Home.❖ Observa que se crea un
archivo .java y otro .xml❖ Crea la interfaz de usuario
para este fragmento.
![Page 5: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/5.jpg)
Agregando fragmentosLa forma más sencilla de agregar un fragmento es con un componente <fragment>, pero también es la menos flexible.
De esta manera puedes agregar fragmentos 'estáticos', es decir se comportan como cualquier otro componente.
Agregando fragmentos de manera dinámica
❖ Los fragmentos se pueden manipular de manera dinámica.
❖ Agregamos un 'contenedor' a la interfaz y con programación podemos poner/quitar fragmentos.
![Page 6: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/6.jpg)
Agregar un fragmento
HomeFrag fragHome = new HomeFrag();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaccion = fm.beginTransaction();
transaccion.replace(R.id.contFragmentos, fragHome);
transaccion.commit();
Opciones para agregar fragmentosHomeFrag fragHome = new HomeFrag(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaccion = fm.beginTransaction(); transaccion.replace(R.id.contFragmentos, fragHome);
transaccion.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaccion.addToBackStack(null); // Pila de pantallas
transaccion.commit();
![Page 7: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/7.jpg)
Ahora te toca a tiCrea los otros 3 fragmentos para completar la app. Muestra el correspondiente cada vez que el usuario selecciona un botón diferente en la barra de navegación.
Práctica
❖ Implementamos una app que muestre un índice con una lista de materias.
❖ Al oprimir una materia se carga la información detallada.
❖ En el teléfono hay dos actividades.
❖ En la tableta, hay una sola mostrando la lista y los detalles.
![Page 8: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/8.jpg)
DiseñoMaestroActiv DetalleActiv
<fragment>MateriaDetalleFrag
- indice+ setIndice
Creando el proyecto
❖ Crea el proyecto Materias.
❖ La actividad principal es MaestroActiv. Empty Activity.
❖ SDK mínimo 19.❖ Crea una segunda actividad
DetalleActiv. Empty Activity.
![Page 9: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/9.jpg)
Navegación❖ Agrega un botón de prueba en la actividad principal.
❖ Al hacer click al botón, inicia la segunda actividad por medio de un Intent.
❖ Crea un emulador de tablet y prueba la app tanto en teléfono como en tableta.
Agregando un fragmento
❖ Agrega un fragmento en blanco al proyecto.
❖ Nombre: MateriaDetalleFrag.
❖ Pide que se cree el archivo XML.
![Page 10: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/10.jpg)
Layout del fragmento
1. fragment_materia_detalle.xml
❖ Agrega/Modifica el TextView (tvTitulo) como título que contendrá el nombre de la materia que se despliega.
❖ Agrega un TextView (tvDetalle). Ocupa todo el espacio inferior disponible para desplegar la información de la materia.
Agregando un fragmento2. activity_detalle.xml
❖ Utiliza un componente fragment para agregar el fragmento al layout de detalle.
![Page 11: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/11.jpg)
DetalleActiv<fragment> fragDetalleMateriaDetalleFrag
- indice+ setIndice
DiseñoMaestroActiv
findF
ragm
entB
yId
Comunicándonos con el Fragmento❖ Crea la clase Materia que servirá para proporcionar los
datos que queremos desplegar.❖ https://gist.github.com/rmroman/4fdacaefb1dcf352f0ba97cd5ec2ec85
❖ Ahora, la actividad (DetalleActiv) necesita indicarle al fragmento cuál materia desplegar.
❖ Agrega a MateriaDetalleFrag una variable de instancia indice de tipo int y el método set.
![Page 12: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/12.jpg)
FragmentManager❖ Para comunicarse con el fragmento, la actividad
requiere una referencia al fragmento.
❖ Esto se logra con el método findFragmentById() del administrador de fragmentos.
MateriaDetalleFrag fragmento = (MateriaDetalleFrag)getSupportFragmentManager().findFragmentById(R.id.fragMateriaDetalle);
❖ Si ya tenemos la referencia, podemos enviar el indice que se quiere mostrar usando el método setIndice.fragmento.setIndice(1); // Prueba rápida
Cambiando propiedades del fragmento❖ En el método onStart(), recuperamos las referencias a
los componentes que queremos modificar.@Override public void onStart() { super.onStart();
View v = getView(); if (v != null) { TextView tvMateria = v.findViewById(R.id.tvMateria); TextView tvDetalle = v.findViewById(R.id.tvDetalle); Materia materia = Materia.materias[indice]; tvMateria.setText(materia.getNombre()); tvDetalle.setText(materia.getDescripcion()); } }
![Page 13: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/13.jpg)
Implementa la lista de materias❖ Crea un nuevo fragmento sin layout, llámalo
ListaMateriasFrag.
❖ Cambia la superclase y el método onCreate.public class ListaMateriasFrag extends ListFragment { public ListaMateriasFrag() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } }
Datos para la lista
❖ En el método onCreateView vamos a crear el adaptador de la lista.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
String[] materias = new String[Materia.materias.length]; for(int i=0; i<materias.length; i++) { materias[i] = Materia.materias[i].getNombre(); }
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(inflater.getContext(), android.R.layout.simple_list_item_1, materias);
setListAdapter(adaptador);
return super.onCreateView(inflater, container, savedInstanceState); }
![Page 14: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/14.jpg)
DetalleActiv<fragment> fragDetalleMateriaDetalleFrag
- indice+ setIndice
DiseñoMaestroActiv
<fragment> ListaMateriasFrag
findF
ragm
entB
yId
Agrega la lista a la actividad principal❖ En activity_maestro.xml agregamos un fragment de tipo
ListaMateriasFrag.
❖ Corre la app y observa cómo despliega la lista de materias.
❖ Solo falta detectar el click sobre la materia y llamar al detalle con el dato correspondiente.❖ Este click lo detecta el fragmento, lee el índice correspondiente
y lo manda a la actividad, para que, a su vez, lo reenvíe a la actividad de Detalle. Después la actividad de detalle lo manda al fragmento detalle para mostrar el detalle de la materia. 😁
![Page 15: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/15.jpg)
DetalleActiv<fragment> fragDetalleMateriaDetalleFrag
- indice+ setIndice
DiseñoMaestroActiv
<fragment> ListaMateriasFrag
indice
click
indice
Interfaces❖ Declara una interface en el fragmento de la lista.
static interface Listener { void itemClicked(long id); }
private Listener listener;
❖ En el método onAttach, guarda el contexto (actividad)public void onAttach(Context context) { super.onAttach(context); this.listener = (Listener)context; }
❖ Sobrescribe el método que recibe el evento.public void onListItemClick(ListView l, View v, int position, long id) { if (listener!=null) { listener.itemClicked(position); } }
![Page 16: Fragmentos - Tec · 2019. 2. 13. · Proyectos de desarrollo para dispositivos móviles Fragmentos Android Fragmento Un fragmento es una parte de una actividad con ciclo de vida propio](https://reader035.vdocuments.pub/reader035/viewer/2022062610/610c9e77cc2eca7d1906a5a4/html5/thumbnails/16.jpg)
Implementando la interface
❖ Implementa la interface en la actividad principal y sobrescribe el método itemClicked.
public class MaestroActiv extends AppCompatActivity implements ListaMateriasFrag.Listener { @Override public void itemClicked(int posicion) { Intent intDetalle = new Intent(this, DetalleActiv.class); intDetalle.putExtra("ID", posicion); startActivity(intDetalle); } }
Terminando❖ Finalmente, en la actividad de Detalle, lee el valor que
se pasó en el Intent y envíalo al fragmento.public class DetalleActiv extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detalle);
MateriaDetalleFrag fragmento = (MateriaDetalleFrag)getSupportFragmentManager().findFragmentById(R.id.fragMateria); //fragmento.setId(1); int id = getIntent().getExtras().getInt("ID"); fragmento.setId(id); } }