Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FragmentActivity. Puedes combi nar vari os fragme nt os en una sol a acti vidad para
crear una I U multi panel y vol ver a usar un fragment o en diferent es acti vi dades. Puedes
pensar en un frag ment o co mo una secci ón modul ar de una acti vi dad que tiene un ci cl o
de vi da pr opi o, que reci be sus pr opi os event os de entrada y que puedes agregar o quit ar
mi entras l a acti vi dad se est é ej ecut ando (al go así co mo una "subacti vi dad" que puedes
vol ver a usar en diferent es acti vi dades).
Un frag ment o si e mpr e debe est ar al oj ado en una acti vi dad y el ci cl o de vi da del
frag ment o se ve afect ado direct a ment e por el ci cl o de vi da de l a acti vi dad anfitri ona.
Por ej e mpl o, cuando l a acti vi dad est á pausada, tambi én l o est án t odos sus frag ment os, y
cuando l a acti vi dad se destruye, l o mi s mo ocurre con t odos l os frag ment os. Si n
e mbar go, mi entras una acti vi dad se est á ej ecut ando (est á en el est ado del cicl o de vi da
reanudada), puedes mani pul ar cada fragment o de for ma i ndependi ent e, por ej e mpl o,
para agregarl o o quit arl o. Cuando reali zas una transacci ón de frag ment os como est a,
ta mbi én puedes agregarlos a una pil a de acti vi dades admi ni strada por la acti vi dad; cada
entrada de l a pil a de activi dades en l a acti vi dad es un registro de la transacci ón de
frag ment os reali zada. La pil a de acti vi dades le permi t e al usuari o i nvertir una
transacci ón de frag ment os (navegar haci a atrás) al presi onar el bot ón At rás.
Est e docu ment o descri be cómo crear t u apli caci ón para usar fragment os, i ncl ui do có mo
l os fragment os pueden mant ener su est ado cuando se agregan a la pil a de acti vi dades de
la acti vi dad, cómo pueden co mpartir event os con la acti vi dad y con otros frag ment os en
la acti vi dad, cómo pueden contri buir con l a barra de app de l a acti vi dad, etc.
Para obt ener i nfor maci ón sobre el manej o de l os cicl os de vi da, i ncl ui da orient aci ón
sobre prácti cas reco mendadas, consult a l os si gui entes recursos:
Por ej e mpl o, una apli cación de noti ci as puede usar un frag ment o para mostrar una list a
de artícul os a la izqui erda y otro frag ment o para mostrar un artícul o a la derecha; a mbos
frag ment os aparecen en una acti vi dad, uno al lado del otro, y cada frag ment o tiene su
pr opi o conj unt o de mét odos de devol uci ón de llama da del ci cl o de vi da y ad mi ni stra sus
pr opi os event os de entrada del usuari o. Ent onces, en l ugar de usar una activi dad para
sel ecci onar un artícul o y otra acti vi dad para leer el artícul o, el usuari o puede sel ecci onar
un artí cul o y l eerl o dentro de l a mi s ma acti vi dad, tal como se il ustra en el diseño de
tabl et en l a fi gura 1.
Fi gura 1: Ej e mpl o de l a ma nera en que dos módul os de la I U defi ni dos por fragment os
se pueden co mbi nar en una acti vi dad para un diseño de t abl et y se present an por
separado para un diseño de t el éfono.
Por ej e mpl o, para conti nuar con el ej e mpl o de l a apli caci ón de noti ci as, la apli caci ón
puede i nt egrar dos fragment os en l a Acti vi dad A cuando se ej ecut a en un dispositi vo del
ta maño de una t abl et. Si n e mbar go, en una pant alla de t el éfono, no hay sufici ent e
espaci o para a mbos fragme nt os, por l o que l a Activi dad A i ncl uye sol o el fragment o
para la lista de artícul os, y cuando el usuari o sel ecci ona un artícul o, se i ni cia l a
Acti vi dad B, que i ncl uye el segundo frag ment o para poder leer el artícul o. Por l o tant o,
la apli caci ón ad mit e tablet s y tel éfonos al reutilizar fragment os en diferentes
co mbi naci ones, como se il ustra en l a fi gura 1.
Para obt ener más i nf or maci ón acerca de cómo di señar t u apli caci ón con diferent es
co mbi naci ones de frag ment os para disti nt as configuraci ones de pant all a, lee l a guí a
Descri pci ón general de la compati bili dad de pant allas.
Có mo crear un frag me nt o
Fi gura 2: Ci cl o de vi da de un frag ment o ( mi entras su acti vi dad est á ej ecuci ón).
Para crear un frag ment o, debes crear una subcl ase Fragment (o una subcl ase exist ent e
de ell a). La cl ase Fragment tiene un códi go que se ase mej a bast ant e a una Activity.
Conti ene mét odos de devol uci ón de lla mada si milares a l os de una acti vi dad, como
onCreate(), onStart(), onPause() y onStop(). De hecho, si est ás convi rtiendo una
apli caci ón de Andr oi d exist ent e para utilizar fragme nt os, deberí as si mpl eme nt e trasl adar
códi go de l os mét odos de devol uci ón de lla mada de t u acti vi dad a l os mét odos
respecti vos de t u frag ment o.
General ment e, debes i mple ment ar al menos l os si gui ent es mét odos del ci cl o de vi da:
onCreate()
El sist e ma l o lla ma cuando crea el fragment o. En t u i mpl e ment aci ón, debes
i ni ci alizar component es esenci al es del frag ment o que qui eras conser var cuando
el frag ment o se pause o se det enga, y l uego se reanude.
onCreateView()
El sist e ma l o lla ma cuando el frag ment o debe diseñar su i nt erfaz de usuario por
pri mera vez. Afi n de diseñar una I U para t u fragme nt o, debes mostrar un View
desde est e mét odo, que será la raí z del diseño de tu frag ment o. Puedes mostrar
un val or nul o si el frag ment o no pr oporci ona una I U.
onPause()
El sist e ma ll a ma a est e mét odo co mo el pri mer i ndicador de que el usuari o est á
abandonando el frag ment o (aunque no si e mpr e si gnifi ca que el frag ment o se est é
destruyendo). General ment e, est e es el mo ment o en el que debes confir mar l os
ca mbi os que deban conservarse más all á de la sesión de usuari o act ual (porque
es posi bl e que el usuari o no vuel va).
La mayorí a de l as apli caci ones deben i mpl e ment ar al menos est os tres mét odos para
cada frag ment o, per o hay muchos otros mét odos de devol uci ón de lla mada que t a mbi én
debes usar para mani pul ar varias fases del ci cl o de vi da del frag ment o. Todos l os
mét odos de devol uci ón de lla mada del ci cl o de vida se discut en más det allada ment e en
la secci ón Có mo control ar el ci cl o de vi da de un frag ment o.
Ten en cuent a que el códi go que i mpl e ment a las acci ones del ci cl o de vi da de un
co mponent e dependi ent e debe col ocarse en el propi o co mponent e, y no en las
i mpl e ment aci ones de devol uci ón de lla mada de l os fragment os. Consult a Cómo
control ar ci cl os de vi da con co mponent es de ci cl os de vi da para obt ener más
i nfor maci ón sobre có mo hacer que l os co mponent es de t us dependenci as tengan en
cuent a l os ci cl os de vi da.
Exi st en t a mbi én al gunas subcl ases que qui zá desees ext ender, en l ugar de la cl ase de
base Fragment:
DialogFragment
Muestra un di ál ogo fl ot ant e. Usar est a cl ase para crear un di ál ogo es una buena
alt ernati va al uso de mét odos del asist ent e de di álogos en l a cl ase Activity, ya
que puedes i ncor porar un di ál ogo del frag ment o en l a pil a de acti vi dades de
frag ment os ad mi ni strados por la acti vi dad, l o que le per mit e al usuari o vol ver a
un frag ment o descart ado.
ListFragment
Muestra una list a de el eme nt os ad mi ni strados por un adapt ador (co mo un
SimpleCursorAdapter), al i gual que ListActivity. Pr oporci ona vari os
mét odos para ad mi ni strar una vist a de list a, como la devol uci ón de lla mada
onListItemClick() para mani pul ar event os de clic. ( Ten en cuent a que el
mét odo preferi do para mostrar una list a es utilizar Recycl er Vi e w en l ugar de
Li st Vi e w. En est e caso, necesit arí as crear un fragme nt o que i ncl uya un
Recycl er Vi e w en su diseño. Consult a Có mo crear una list a con Recycl er Vi e w
para ver cómo hacerl o).
PreferenceFragmentCompat
Muestra una j erarquí a de obj et os Preference en for ma de list a. Est e obj et o se
usa a fi n de crear una pantalla de confi guraci ón para t u app.
Un frag ment o general ment e se usa co mo part e de la i nt erfaz de usuari o de una acti vi dad
y l e aport a su pr opi o diseño.
Si qui eres pr oporci onar un diseño para un frag ment o, debes i mpl e ment ar el mét odo de
devol uci ón de lla mada onCreateView(), al cual el sist e ma Andr oi d lla ma cuando llega
el mo ment o de que el frag ment o defi na su diseño. Tu i mpl e ment aci ón de est e mét odo
debe mostrar un View, que es la raí z del diseño de t u frag ment o.
Not a: Si t u frag ment o es una subcl ase de ListFragment, la i mpl e ment aci ón
predet er mi nada muestra un ListView desde onCreateView(), de modo que no
necesit as i mpl e ment arl a.
Por ej e mpl o, a conti nuación, se muestra una subclase de Fragment, que carga un diseño
desde el archi vo example_fragment.xml:
Kotli nJava
class ExampleFragment : Fragment() {
El pará metro container que se pasa a onCreateView() es el ViewGroup pri nci pal (del
di seño de l a acti vi dad) en el cual se i nsert ará el diseño de t u fragment o. El pará metro
savedInstanceState es un Bundle que pr oporciona dat os acerca de l a i nstanci a previ a
del frag ment o si el frag ment o se est á reanudando (la rest auraci ón del est ado se discut e
más det all ada ment e en l a secci ón Có mo control ar el ci cl o de vi da de un frag ment o).
Ya vi st e có mo crear un frag ment o que pr oporci one un diseño. Ahora deberás agregar el
frag ment o a t u acti vi dad.
General ment e, un frag ment o aport a una part e de l a I U a la acti vi dad anfitri ona, que se
i nt egra co mo part e de la jerar quí a de vist as general de l a acti vi dad. Exi st en dos maneras
de agregar un frag ment o al diseño de l a acti vi dad:
En est e caso, puedes especifi car propi edades de diseño para el frag ment o co mo
si fueran una vist a. Por eje mpl o, aquí te mostra mos un archi vo de diseño para
una acti vi dad con dos frag ment os:
Cuando el sist e ma crea el diseño de est a acti vi dad, crea una i nst anci a para cada
frag ment o especifi cado en el diseño, ade más de lla mar al mét odo
onCreateView(), con el obj eti vo de recuperar el diseño de cada fragment o. El
sist e ma i nsert a el obj et o View que muestra el fragme nt o direct a ment e en l ugar
del el e ment o <fragment>.
Not a: Cada frag ment o requi ere un i dentificador úni co que el sist e ma puede usar
para rest aurar el frag ment o si se rei ni ci a la acti vi dad (y que t ú puedes usar para
que el fragment o reali ce transacci ones, como quit arl o). Hay tres f or mas de
pr oporci onarl e un I D a un frag ment o:
Mi entras t u acti vi dad se est á ej ecut ando, puedes agregar frag ment os al diseño.
Sol o necesit as especifi car un ViewGroup en el que se col ocará el frag ment o.
Para reali zar transacci ones de fragment os en t u acti vi dad (co mo agregar, quit ar o
ree mpl azar un frag ment o), debes usar las API de FragmentTransaction.
Puedes obt ener una i nst anci a de FragmentTransaction de t u
FragmentActivity co mo est a:
Kotli nJava
Luego, puedes agregar un frag ment o usando el mét odo add() y especifi cando el
frag ment o que se agregará, así como l a vist a en l a que se i nsertará. Por ej empl o:
Kotli nJava
val fragment = ExampleFragment()
fragmentTransaction.add(R.id.fragment_container, fragment)
fragmentTransaction.commit()
El pri mer argu ment o que se pasa a add() es ViewGroup, en el que se debe
col ocar el frag ment o especifi cado por el I D de recurso, y el segundo pará metro
es el frag ment o que qui eres agregar.
Una vez que reali ces l os ca mbi os con FragmentTransaction, deberás llamar a
commit() para que se apli quen esos ca mbi os.
Có mo ad mi ni strar frag me nt os
Para ad mi ni strar l os fragme nt os de t u acti vi dad, debes usar FragmentManager. Para
obt enerl o, lla ma a getSupportFragmentManager() desde t u acti vi dad.
Entre l as cosas que puedes hacer con FragmentManager, se i ncl uyen l as sigui ent es:
Obt ener frag ment os que ya exist en en l a acti vi dad con findFragmentById()
(para frag ment os que pr oporci onan una I U en el diseño de l a acti vi dad) o
findFragmentByTag() (para frag ment os con o sin I U)
Acti var frag ment os de la pil a de retroceso con popBackStack() (si mul ando el
uso del comando At rás por part e del usuari o)
Regi strar un recept or para ca mbi os reali zados en la pil a de retroceso con
addOnBackStackChangedListener()
Para obt ener más i nf or maci ón acerca de est os y otros mét odos, consult a la
docu ment aci ón sobre l a clase FragmentManager.
Co mo se mostró en l a secci ón ant eri or, ta mbi én puedes usar FragmentManager para
abrir un FragmentTransaction, que t e per mit e reali zar transacci ones como agregar y
quit ar frag ment os.
Kotli nJava
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
Cada transacci ón es un conj unt o de ca mbi os que qui eres reali zar al mis mo tie mpo.
Puedes confi gurar t odos los ca mbi os que desees reali zar en una transacci ón det er mi nada
con mét odos como add(), remove() y replace(). Luego, para apli car la transacci ón a
la acti vi dad, debes lla mar a commit().
Si n e mbar go, ant es de llamar a commit() pr obable ment e te convenga lla mar a
addToBackStack() para agregar la transacci ón a una pil a de retroceso de transacci ones
de frag ment os. Est a pil a de acti vi dades est á ad mi ni strada por la acti vi dad y l e per mit e al
usuari o vol ver a un est ado ant eri or del frag ment o presi onando el bot ón At rás.
Por ej e mpl o, aquí te mostra mos có mo puedes reempl azar un frag ment o por otro y
conser var el est ado ant erior en l a pil a de acti vi dades:
Kotli nJava
val newFragment = ExampleFragment()
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, newFragment)
transaction.addToBackStack(null)
transaction.commit()
En est e ej e mpl o, newFragment ree mpl aza al fragme nt o (si l o hay) que se encuentra
act ual ment e en el cont enedor de diseño i dentificado con el I D
R.id.fragment_container. Al lla mar a addToBackStack(), la transacción de
ree mpl azo se guar da en la pil a de retroceso para que el usuari o pueda revertir la
transacci ón y recuperar el frag ment o previ o presi onando el bot ón At rás.
FragmentActivity l uego obti ene aut omáti ca mente frag ment os de l a pil a de retroceso
me di ant e onBackPressed().
Si agregas vari os ca mbi os a la transacci ón (como otro add() o remove()) y lla mas a
addToBackStack(), t odos l os ca mbi os apli cados ant es de lla mar a commit() se
agregarán a la pil a de retroceso co mo una transacci ón úni ca, y el bot ón At rás l os
revertirá j unt os.
Si no lla mas a addToBackStack(), cuando reali ces una transacci ón que quit e un
frag ment o, ese fragment o se destruirá cuando se confir me l a transacci ón y el usuari o no
podrá regresar a él. Si n embar go, si lla mas a addToBackStack(), cuando se eli mi ne un
frag ment o, el frag ment o se det endrá y se reanudará si el usuari o retrocede en l a
navegaci ón.
Sugerenci a: Para cada transacci ón de fragment os, puedes apli car una ani maci ón de
transi ci ón lla mando a setTransition() ant es de confir mar.
Advertenci a: Puedes confir mar una transacci ón con commit() sol o ant es de que l a
acti vi dad guar de su est ado (cuando el usuari o l a abandone). Si i nt ent as confir mar
después de ese mo ment o, se pr oducirá una excepción. Est o ocurre por que se podrí a
per der el est ado después de l a confir maci ón si fuera necesari o rest aurar la acti vi dad. En
sit uaci ones en l as cual es no i mport e per der la confir maci ón, usa
commitAllowingStateLoss().
Có mo co muni carse con l a activi dad
Si bi en un Fragment se impl e ment a co mo un obj et o dependi ent e de un
FragmentActivity y puede usarse dentro de múlti pl es acti vi dades, una i nstanci a
det er mi nada de un fragment o est á direct a ment e vincul ada a l a acti vi dad que l a conti ene.
Kotli nJava
val listView: View? = activity?.findViewById(R.id.list)
De l a mi s ma manera, t u acti vi dad puede lla mar a mét odos del frag ment o me di ant e l a
adqui si ci ón de una referenci a a Fragment desde FragmentManager usando
findFragmentById() o findFragmentByTag(). Por ej e mpl o:
Kotli nJava
val fragment =
supportFragmentManager.findFragmentById(R.id.example_fragment) as
ExampleFragment
En al gunos casos, es posibl e que necesit es un fragme nt o para co mpartir event os o dat os
con l a acti vi dad o l os otros frag ment os al oj ados en ell a. Para co mpartir datos, crea un
Vi e wModel co mparti do, co mo se descri be en l a secci ón " Có mo co mpartir dat os entre
frag ment os" en l a guí a de Vi e wModel. Si necesitas pr opagar event os que no pueden
control arse con un Vi e wModel, defi ne una i nt erfaz de devol uci ón de lla mada dentro del
frag ment o y fuerza a la acti vi dad anfitri ona para que l a i mpl e ment e. Cuando l a acti vi dad
reci ba una devol uci ón de lla mada a través de la i nterfaz, podrá co mpartir la i nfor maci ón
con otros frag ment os del di seño según sea necesari o.
Por ej e mpl o, si una apli caci ón de noti ci as tiene dos frag ment os en una acti vi dad, uno
para mostrar una list a de artí cul os (fragment o A) y otro para exhi bir un artícul o
(frag ment o B), el frag ment o A debe i ndi carl e a la acti vi dad en qué mo ment o se
sel ecci ona un el e ment o de l a lista para que pueda inf or marl e al frag ment o B que debe
exhi bir el artícul o. En este caso, la i nt erfaz OnArticleSelectedListener se decl ara
dentro del fragment o A:
Kotli nJava
public class FragmentA : ListFragment() {
...
// Container Activity must implement this interface
interface OnArticleSelectedListener {
fun onArticleSelected(articleUri: Uri)
}
...
}
Luego, la acti vi dad que al oj a al frag ment o i mpl e ment a l a i nt erfaz
OnArticleSelectedListener y anul a onArticleSelected() para notificar al
frag ment o B sobre el event o del frag ment o A. Para garanti zar que l a acti vidad anfitri ona
i mpl e ment e est a i nt erfaz, el mét odo de devol uci ón de lla mada onAttach() del
frag ment o A(al cual el sist e ma lla ma cuando agrega el fragment o a la acti vi dad) crea
una i nst anci a de OnArticleSelectedListener ordenando l a Activity que se pasa a
onAttach():
Kotli nJava
public class FragmentA : ListFragment() {
}
...
}
Kotli nJava
public class FragmentA : ListFragment() {
Tus frag ment os pueden aport ar el e ment os de menú al menú de opci ones de la acti vi dad
(y, en consecuenci a, a la barra de app) i mpl e ment ando onCreateOptionsMenu(). Si n
e mbar go, para que est e mét odo pueda reci bir llama das, debes lla mar a
setHasOptionsMenu() durant e onCreate() para i ndi car que el frag ment o i nt ent a
agregar el e ment os al menú de opci ones. De l o contrari o, el frag ment o no reci birá una
lla mada a onCreateOptionsMenu().
Los el e ment os que agregues al menú de opci ones desde el frag ment o se anexarán a l os
el e ment os de menú exi stent es. El frag ment o t a mbién reci be devol uci ones de lla madas a
onOptionsItemSelected() cuando se sel ecci ona un el e ment o de menú.
Ta mbi én puedes regi strar una vist a en el diseño de t u frag ment o para pr oporci onar un
me nú cont ext ual lla mando a registerForContextMenu(). Cuando el usuari o abre el
me nú cont ext ual, el fragme nt o reci be una lla mada a onCreateContextMenu(). Cuando
el usuari o sel ecci ona un el e ment o, el frag ment o reci be una lla mada a
onContextItemSelected().