是什么getSupportFragmentManager()和getChildFragmentMan

2019-07-19 11:14发布

我的类继承片段,这就是为什么它不能使用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;
    }

}

Answer 1:

的定义getChildFragmentManager()为:

返回私人FragmentManager用于放置和管理片段此片段内。

同时的定义getFragmentManager()或在这种情况下getSupportFragmentManager()为:

返回FragmentManager用于与该片段的活动相关的片段进行交互。

基本上,所不同的是碎片的,现在有自己的内部FragmentManager可以处理片段。 孩子FragmentManager是处理包含只知道它被添加到片段中的片段之一。 另一FragmentManager被包含在整个内Activity

在这种情况下,我猜是你已经添加了片段活动的FragmentManager。 你得到孩子FragmentManager不包含你在找什么。 因此,你得到的异常,因为它无法找到给定ID的碎片,因为它是在不同的FragmentManager。



Answer 2:

getFragmentManager属于Activity
getChildFragmentManager属于Fragment

例如,我们有一个应用程序,它具有MainActivityFragment1Fragment2container_view_on_main是在布局activty_main.xml

要显示 Fragment1MainActivity我们必须使用getSupportFragmentManager()

getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());

要显示 Fragment2Fragment1 ,我们有2路

USE getFragmentManager()

getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());

USE getChildFragmentManager()

首先,我们要创建一个ID布局container_view_on_fragment1fragment1.xml ,然后

getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();

结论

在本演示中,我觉得我们应该用getFragmentManager()从去当Fragment1Fragment2因为它是简单和良好的性能( Fragment1将停止时Fragment2开放)

当我们使用getChildFragmentManager()
例如您的MainActivityViewPager其中有3页,则需要更换一些片段的每个页面中。

更多
- getParentFragment()
getFragmentManager() =>返回空
getChildFragmentManager() =>总是返回根片段( Fragment1中演示,即使我们去Fragment3 ,, ...)

这个答案是我的基地了解,所以请纠正我,如果我错了。 希望它能帮助



文章来源: What is difference between getSupportFragmentManager() and getChildFragmentManager()?