android - studio - ¿Cuál es la diferencia entre getSupportFragmentManager() y getChildFragmentManager()?
tabhost android studio (2)
La definición de getChildFragmentManager()
es:
Devuelve un FragmentManager privado para colocar y administrar Fragmentos dentro de este Fragmento.
Mientras tanto, la definición de getFragmentManager()
(o en este caso getSupportFragmentManager()
) es:
Devuelve FragmentManager para interactuar con los fragmentos asociados con la actividad de este fragmento.
Básicamente, la diferencia es que Fragment ahora tiene su propio FragmentManager
interno que puede manejar Fragmentos. El niño FragmentManager es el que maneja los Fragmentos contenidos solo en el Fragmento al que se agregó. El otro FragmentManager está contenido dentro de toda la Activity
.
En este caso, lo que supongo es que agregaste los Fragmentos al FragmentManager de la Actividad. Obtiene el niño FragmentManager que no contiene lo que está buscando. Por lo tanto, obtienes la excepción porque no puede encontrar el Fragmento con la ID dada porque está en un FragmentManager diferente.
Mi clase hereda Fragment y es por eso que no puede usar getSupportFragmentManager (). Estoy usando getChildFragmentManager y me está mostrando Error - IllegalArguementException: No se encontró una vista para el id ... error.
Cualquier orientación sería apreciada.
El código para llamar a AttachmentsListFragment es
Bundle b = new Bundle();
b.putSerializable("AttachmentsList", msg.attachments);
AttachmentListFragment listfrag = new AttachmentListFragment(msg.attachments);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.attachmentslistcontainer, listfrag);
transaction.addToBackStack(null);
transaction.commit();
attachmentslayout.xml es
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/attachmentslistcontainer"
android:orientation="vertical" >
<TextView
android:id="@+id/textViewAttachmentHeader"
style="@style/Normal.Header.Toolbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/list_separator_background"
android:ellipsize="end"
android:gravity="center"
android:maxLines="2"
android:text="@string/attachments_header"
android:textColor="#FFFFFFFF"
android:textSize="22sp"
android:textStyle="bold"
android:visibility="visible" />
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</FrameLayout>
AttachmentsListFragment.java
public class AttachmentListFragment extends ListFragment implements IAttachmentsData {
ArrayList<Attachments> items = null;
Integer cellLayoutID;
Integer index;
public AttachmentListFragment() {
}
public AttachmentListFragment(ArrayList<Attachments> items) {
this.items = items;
Log.i("Logging", "Items size" + items.size()); //$NON-NLS-1$
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle;
if (savedInstanceState != null) {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
//super.onCreateView(inflater, container, savedInstanceState);
// setContentView(R.layout.attachmentslayout);
View view = inflater.inflate(R.layout.attachmentslayout, container, false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new AttachmentAdapter(
getActivity().getApplicationContext(),
R.layout.attachmentslistcellcontent,
items));
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
index = position;
Intent intent = new Intent();
Bundle b = new Bundle();
b.putByteArray("Data", items.get(position).getImageData());
intent.putExtras(b);
}
public byte[] getData() {
// TODO Auto-generated method stub
if (items != null && index < items.size()) {
return items.get(index).getImageData();
}
return null;
}
}
getFragmentManager
pertenece a la Activity
getChildFragmentManager
pertenece a Fragment
Ejemplo tenemos una aplicación que tiene MainActivity
, Fragment1
, Fragment2
, container_view_on_main
es un diseño en activty_main.xml
PARA visualizar Fragment1
en MainActivity
debemos usar getSupportFragmentManager()
getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
Para mostrar Fragment2
desde Fragment1
tenemos 2 formas
UTILIZAR getFragmentManager()
getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
UTILIZAR getChildFragmentManager()
Primero, tenemos que crear un diseño con id container_view_on_fragment1
dentro de fragment1.xml
, luego
getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();
CONCLUSIÓN
En esta demostración, creo que deberíamos usar getFragmentManager()
cuando getFragmentManager()
de Fragment1
a Fragment2
porque es simple y bueno para el rendimiento ( Fragment1
se detendrá cuando Fragment2
abra)
Cuando usamos getChildFragmentManager()
?
Ejemplo su MainActivity
tiene un ViewPager
que tiene 3 páginas, dentro de cada página necesita reemplazar algún fragmento.
MÁS
- getParentFragment ()
getFragmentManager()
=> return null
getChildFragmentManager()
=> siempre devuelve un fragmento de raíz ( Fragment1
en demostración incluso vamos a Fragment3 ,, ...)
Esta respuesta se basa en mi comprensión así que corrígeme si me equivoco. Espero que ayude