В чем разница между getSupportFragmentManager() и getChildFragmentManager()?


мой класс наследует фрагмент и поэтому он не может использовать 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 55

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 on 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() = > return null
getChildFragmentManager() = > всегда возвращать корневой фрагмент (Fragment1 в демо даже мы идем к Fragment3,,... )

этот ответ основан на моем понимании, поэтому, пожалуйста, поправьте меня, если я ошибаюсь. Надеюсь, это поможет