viernes, 3 de octubre de 2014

Fragments

Los fragments son porciones de la interfaz de usuario en Android que permiten mayores capacidades a la hora de construir los mismos, que contribuyen a la adaptación a múltiples formatos de pantallas y la reutilización de código, además de otras características relacionadas como facilitar la comunicación entre partes de la aplicación o la animación de transiciones.

Compatibilidad

v11
Inferiores con support.v4

Lo mínimo necesario

Una clase tipo Fragment:
public class PortadaFragment extends Fragment{
      
       @Override
       public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
             //Cargar la vista
             View rootView = inflater.inflate(R.layout.frag_portada,
container, false);
            
             //Inicializar la vista
             inicializar(rootView);
            
             return rootView;
       }
      
       /**
        * Inicializar componentes visuales
        * @param view vista actual
        */
       private void inicializar(View view){
       ...   
       }

}

Un fichero de layout para el fragment, que contendrá elementos habituales del interfaz:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/ivImagen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:src="@drawable/earth" />

</FrameLayout>

Una activity de tipo FragmentActivity:
public class MainActivity extends FragmentActivity {

El fragment como parte del layout de la Activity:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
   
    <fragment
        android:id="@+id/content_fragment"
        class="es.hubiqus.drawer.fragment.PortadaFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />   

</LinearLayout>

Al cargar el layout principal se cargarán todos los fragments que estén incluidos dentro. Los fragments siguen un ciclo de vida similar al de las Activity que los incluyen, con lo que las precauciones a la hora de mantener el estado se deben extremar. También es necesario tener especial cuidado cuando un mismo fragment se comparte entre activities, o un fragment incluye a su vez otros fragments.  

Transacciones

Las transacciones permiten modificar partes del interfaz del usuario en tiempo de ejecución. Las transacciones se pueden ejecutar sobre cualquier containerView de un layout que contenga o no fragments, aunque habitualmente se ejecuta sobre frames o fragments directamente.
//Comenzar transacción
FragmentTransaction t = getSupportFragmentManager().beginTransaction();

//Animación de transición (opcional)
t.setCustomAnimations(android.R.anim.slide_in_left,
                                    android.R.anim.slide_out_right);

//Reemplazar lo que se encuentre en content_frame con el nuevo fragment              
t.replace(R.id.content_frame, newFragment);

//Añadir transacción al back stack para que se deshaga con el Atrás     
t.addToBackStack(null);

//Confirmar
t.commit();

Destacar del código anterior, que el comportamiento del botón atrás será similar al que se produce al lanzar una Activity completa, es decir al pulsar atrás el último fragment se eliminará para dejar paso al que ocupaba la pantalla en el momento anterior, ya sea un fragment que ocupa la pantalla completa, o solamente una parte de ella.
Si lo que se desea es que al pulsar el botón atrás se cierre la Activity, independientemente de las transacciones de fragments que se hayan producido, se debe cancelar el backStack para dicha transacción antes de confirmarla:
t.disallowAddToBackStack();

También a través de una transacción se puede quitar un fragment de pantalla, así como reemplazar, añadir, ocultar…:
Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_frm);
if (f != null) {
   getSupportFragmentManager().beginTransaction().remove(f).commit();
}

Comunicación

La forma más básica de comunicarse con un fragment es a través de sus argumentos:
Bundle args = new Bundle();
args.putInt(DetalleFragment.PARAM_ID, 5);
args.putSerializable(DetalleFragment.PARAM_ITEM, noticia);
fragment.setArguments(args);

Desde el fragment la información de los argumentos se recupera de forma similar a como se realiza desde una Activity:
Noticia item = (Noticia) this.getArguments().getSerializable(PARAM_ITEM);

Referencias

http://developer.android.com/tools/extras/support-library.html

No hay comentarios:

Publicar un comentario