В чем разница между getSupportFragmentManager() и getChildFragmentManager()?
Мой класс наследует Fragment, и поэтому он не может использовать getSupportFragmentManager(). Я использую getChildFragmentManager, и он показывает мне ошибку - IllegalArguementException: не найдено представление для id... ошибка.
Любое руководство будет оценено.
Код для вызова AttachmentsListFragment есть
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 - это
<?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;
}
}
2 ответа
Определение getChildFragmentManager()
является:
Верните частный FragmentManager для размещения и управления фрагментами внутри этого фрагмента.
Между тем определение getFragmentManager()
(или в этом случае getSupportFragmentManager()
) является:
Верните FragmentManager для взаимодействия с фрагментами, связанными с активностью этого фрагмента.
По сути, разница в том, что фрагменты теперь имеют свои внутренние FragmentManager
которые могут обрабатывать фрагменты. Дочерний FragmentManager - это тот, который обрабатывает фрагменты, содержащиеся только в том фрагменте, к которому он был добавлен. Другой FragmentManager содержится в пределах всего Activity
,
В этом случае я предполагаю, что вы добавили фрагменты в FragmentManager действия. Вы получаете дочерний FragmentManager, который не содержит того, что вы ищете. Таким образом, вы получаете исключение, потому что он не может найти фрагмент с данным идентификатором, потому что он находится в другом FragmentManager.
getFragmentManager
принадлежать Activity
getChildFragmentManager
принадлежать Fragment
Пример у нас есть приложение, которое имеет MainActivity
, Fragment1
, Fragment2
, container_view_on_main
это макет в activty_main.xml
Для отображения Fragment1
на MainActivity
мы должны использовать getSupportFragmentManager()
getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
Для отображения Fragment2
от Fragment1
у нас есть 2 пути
ИСПОЛЬЗОВАНИЕ getFragmentManager()
getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
ИСПОЛЬЗОВАНИЕ getChildFragmentManager()
Сначала мы должны создать макет с идентификатором container_view_on_fragment1
внутри fragment1.xml
, затем
getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();
ЗАКЛЮЧЕНИЕ
В этой демонстрации я думаю, что мы должны использовать getFragmentManager()
когда идти из Fragment1
в Fragment2
потому что это просто и хорошо для производительности (Fragment1
остановится когда Fragment2
открыть)
Когда мы используем getChildFragmentManager()
?
Пример твой MainActivity
иметь ViewPager
которые имеют 3 страницы, внутри каждой страницы вам нужно заменить какой-то фрагмент.
БОЛЬШЕ
- getParentFragment () getFragmentManager()
=> вернуть ноль getChildFragmentManager()
=> всегда возвращать корневой фрагмент (Fragment1
в демке даже идем к Fragment3,,...)
Этот ответ основан на моем понимании, поэтому, пожалуйста, поправьте меня, если я ошибаюсь. Надеюсь, это поможет
Если вы хотите иметь фрагмент, который ведет себя как контейнер фрагментов, вы должны использовать метод getChildFragmentManager для фрагмента. Если вы используете getSupportFragmentManager, вы в основном будете использовать менеджер фрагментов, который ведет себя так, как проходит жизненный цикл действия, а не как ваш фрагмент.
Например, у меня был фрагмент, который содержал ViewPager - он называется CollectionsFragment. Таким образом, у меня было 3 фрагмента, отображаемых в виде вкладок: AllCollectionsFragment, MyCollectionsFragment, FavouriteCollectionsFragment. И я передал getActivity(). GetSupportFragmentManager() в FragmentStatePagerAdapter, который я использовал.
Таким образом, это вызывало следующее поведение - методы onDestroyView/onDestroy/onDetach/onStop для трех фрагментов вкладок не вызывались. Когда я перешел на использование getChildFragmentManager, все было в порядке.
Если вы хотите, вы можете проверить документы для двух методов:
getChildFragmentManager (): Возвращает частный FragmentManager для размещения и управления фрагментами внутри этого фрагмента.
getSupportFragmentManager(): Возвращает FragmentManager для взаимодействия с фрагментами, связанными с активностью этого фрагмента.