tabhost studio example android android-fragments android-listfragment

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