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);
|
No hay comentarios:
Publicar un comentario