Está en la página 1de 13

Un Fragment represent a un co mport a mi ent o o una part e de l a i nt erfaz de usuari o en una

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.

Cuando se agrega un fragme nt o co mo part e de l a present aci ón de l a acti vi dad, se


encuentra en ViewGroup dentro de l a jerarquí a de vi st as de la acti vi dad y el fragment o
defi ne su pr opi o diseño de vist as. Puedes i nsertar un frag ment o en el diseño de l a
acti vi dad decl arando el frag ment o en el archi vo de diseño, como el e ment o <fragment>,
o desde el códi go de t u apli caci ón agregándol o a un archi vo exi st ent e ViewGroup.

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:

 Có mo control ar ci cl os de vi da con co mponent es de ci cl os de vi da


 Guí a de arquit ect ura de apps
 Tabl ets y t el éfonos cel ulares co mpati bl es

Fil osofí a de di seño


Andr oi d i ntroduce l os frag ment os en Andr oi d 3. 0 (ni vel de API 11), pri ncipal ment e
para ad mitir diseños de IU más di ná mi cos y fl exibl es en pant all as grandes, como l as de
las tabl ets. Co mo l a pantall a de una t abl et es mucho más grande que l a de un t el éfono,
hay más espaci o para combi nar e i nt erca mbi ar component es de l a I U. Los frag ment os
ad mit en esos diseños si n la necesi dad de que ad mi ni stres ca mbi os co mpl ej os en l a
jerarquí a de vist as. Al divi dir el diseño de una acti vi dad en frag ment os, puedes
modi ficar el aspect o de la acti vi dad durant e el tiempo de ej ecuci ón y conser var esos
ca mbi os en una pil a de acti vi dades ad mi ni strada por la acti vi dad. Ahora están
di sponi bl es medi ant e la bi bli ot eca de co mpati bili dad de frag ment os.

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.

Debes diseñar cada fragme nt o co mo un co mponent e modul ar y reutilizable de l a


acti vi dad. Co mo cada frag ment o defi ne su pr opi o di seño y su pr opi o comport a mi ent o
con sus pr opi as devol uciones de lla mada del ci cl o de vi da, puedes i ncl uir un frag ment o
en múlti pl es acti vi dades; por l o tant o, debes diseñarl o para vol ver a utilizarlo y evit ar la
ma ni pul aci ón direct a de un frag ment o desde otro frag ment o. Est o es muy import ant e
por que un frag ment o modul ar te per mit e ca mbi ar t us co mbi naci ones de frag ment os para
diferent es ta maños de pant all a. Cuando diseñas t u apli caci ón para que ad mita tabl ets y
tel éfonos, puedes reutilizar t us frag ment os en diferent es confi guraci ones de diseño para
opti mi zar la experi enci a del usuari o en funci ón del espaci o de pant all a disponi bl e. Por
ej e mpl o, en un t el éfono, podrí a ser necesari o separar l os fragment os para proporci onar
una I U de panel úni co cuando no quepa más de uno en l a mi s ma acti vi dad.

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.

Có mo agregar una i nterfaz de usuari o

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.

Para mostrar un diseño desde onCreateView(), puedes agrandarl o desde un recurso de


di seño defi ni do en XML. Para ayudart e a hacerl o, onCreateView() pr oporci ona un
obj et o LayoutInflater.

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() {

override fun onCreateView(


inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, container,
false)
}
}

Not a: En el ej e mpl o ant eri or, R.layout.example_fragment es una referenci a al


recurso de diseño lla mado example_fragment.xml y guar dado en l os recursos de l a
apli caci ón. Para obt ener inf or maci ón acerca de cómo crear un diseño en XML, l ee l a
docu ment aci ón Int erfaz de usuari o.

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).

El mét odo inflate() adopt a tres argu ment os:

 El I D del recurso de diseño que qui eres agrandar


 El ViewGroup que será el el e ment o pri nci pal del diseño agrandado (es
i mport ant e pasar container para que el sist e ma apli que pará metros de diseño a
la vist a de raí z del diseño agrandado, especifi cada por la vist a pri nci pal a la que
se i nt egra)
 Un val or bool eano que i ndi ca si se debe anexar el di seño au ment ado al
ViewGroup (el segundo pará metro) durant e el agranda mi ent o (en est e caso, es
falso por que el sist e ma ya est á i nsertando el diseño au ment ado al container; al
pasar "true", se crearía un gr upo de vist as redundant e en el diseño fi nal)

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.

Có mo agregar un frag me nt o a una 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:

 Decl arar el frag me nt o en el archi vo de di señ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:

 <?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:name="com.example.news.ArticleListFragment"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment
android:name="com.example.news.ArticleReaderFragment"
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
El atri but o android:name de <fragment> especifica la cl ase Fragment para
crear una i nst anci a en el di seño.

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:

o Pr oporci ona el atri but o android:id con un I D único.


o Pr oporci ona el atri but o android:tag con una string úni ca.
 O bi en, guarda el fragme nt o de for ma programáti ca en un ViewGroup
exi stente.

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

val fragmentManager = supportFragmentManager


val fragmentTransaction = fragmentManager.beginTransaction()

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.

Có mo reali zar transacci ones de frag me nt os


Un excel ent e aspect o acerca del uso de fragment os en t u acti vi dad es la capaci dad de
agregar, quit ar, ree mpl azar y reali zar otras acci ones con ell os en respuest a a l a
i nt eracci ón del usuari o. Cada conj unt o de ca mbi os que confir mas en l a activi dad reci be
la deno mi naci ón de transacci ón, y puedes reali zar una usando l as API de
FragmentTransaction. Ta mbi én puedes guar dar cada transacci ón en una pil a de
acti vi dades ad mi ni strada por la acti vi dad, l o que l e per mitirá al usuari o navegar haci a
atrás por l os ca mbi os realizados en el frag ment o (co mo navegar haci a atrás en l as
acti vi dades).

Puedes adquirir una i nst anci a de FragmentTransaction de FragmentManager co mo


est a:

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.

No i mport a el orden en que agregues ca mbi os a un FragmentTransaction, except o por


l o si gui ent e:

 Debes lla mar en últi mo lugar a commit().


 Si est ás agregando múltipl es frag ment os al mi s mo cont enedor, el orden en el que
l os agregas det er mi na el or den en el que aparecen en l a jerarquí a de vist as.

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.

Ll a mar a commit() no reali za la transacci ón i nmedi at a ment e. Se pr ogra ma para


ej ecut arse en el subpr oceso de l a I U de l a acti vi dad (el subpr oceso "pri nci pal ") tan
pr ont o el subpr oceso pueda hacerl o. Si n e mbar go, si es necesari o, puedes lla mar a
executePendingTransactions() desde el subproceso de t u I U para ej ecutar de
i nmedi at o transacci ones envi adas por commit(). General ment e, no es necesari o hacer
est o, a menos que l a transacci ón sea una dependenci a para t areas de otros subpr ocesos.

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.

Es pecífi ca ment e, el fragme nt o puede acceder a la i nst anci a FragmentActivity con


getActivity() y reali zar tareas de manera sencilla, como buscar una vist a en el diseño
de l a acti vi dad:

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

Có mo crear devol uciones de ll a madas de event os a l a acti vi dad

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() {

var listener: OnArticleSelectedListener? = null


...
override fun onAttach(context: Context) {
super.onAttach(context)
listener = context as? OnArticleSelectedListener
if (listener == null) {
throw ClassCastException("$context must implement
OnArticleSelectedListener")
}

}
...
}

Si l a acti vi dad no i mpl eme nt ó l a i nt erfaz, el fragme nt o arroj ará ClassCastException.


Si se reali za con éxit o, el mi e mbr o mListener conser va una referenci a a la
i mpl e ment aci ón de OnArticleSelectedListener por part e de l a acti vi dad para que el
frag ment o A pueda co mpartir event os con est a llama ndo a l os mét odos defi ni dos por la
i nt erfaz OnArticleSelectedListener. Por ej e mpl o, si el fragment o A es una
ext ensi ón de ListFragment, cada vez que el usuari o haga clic en un el e ment o de l a
list a, el sist e ma ll a mará a onListItemClick() en el frag ment o, que l uego lla mará a
onArticleSelected() para co mpartir el event o con l a acti vi dad.

Kotli nJava
public class FragmentA : ListFragment() {

var listener: OnArticleSelectedListener? = null


...
override fun onListItemClick(l: ListView, v: View, position: Int,
id: Long) {
// Append the clicked item's row ID with the content provider
Uri
val noteUri: Uri =
ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id)
// Send the event and Uri to the host activity
listener?.onArticleSelected(noteUri)
}
...
}

El pará metro id que se pasa a onListItemClick() es el I D de l a fila del ele ment o en el


cual se hi zo clic, que l a acti vi dad (u otro fragment o) usa para capt urar el artícul o del
ContentProvider de l a apli caci ón.
Puedes encontrar más i nfor maci ón acerca de cómo usar un pr oveedor de cont eni do en el
docu ment o Pr oveedores de cont eni do.

Có mo agregar artí cul os a l a barra de app

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().

También podría gustarte