84

我的类继承了 Fragment,这就是它不能使用 getSupportFragmentManager() 的原因。我正在使用 getChildFragmentManager,它显示错误 - IllegalArguementException: No view found for 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();

附件layout.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>

附件列表片段.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;
    }

}
4

3 回答 3

165

的定义getChildFragmentManager()是:

返回一个私有的 FragmentManager 用于在这个 Fragment 中放置和管理 Fragment。

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

返回 FragmentManager 以与与此片段的活动关联的片段进行交互。

基本上,不同之处在于 Fragment 现在有自己的内部FragmentManager可以处理 Fragment。子 FragmentManager 是处理仅包含在它添加到的 Fragment 中的 Fragment 的管理器。另一个 FragmentManager 包含在整个Activity.

在这种情况下,我猜你已经将 Fragments 添加到了 Activity 的 FragmentManager。您会得到不包含您要查找的内容的子 FragmentManager。因此,您会收到异常,因为它无法找到具有给定 ID 的 Fragment,因为它位于不同的 FragmentManager 中。

于 2013-02-08T14:59:42.643 回答
32

getFragmentManager属于Activity
getChildFragmentManager属于Fragment

示例我们有一个应用程序,其中MainActivity, Fragment1, Fragment2,container_view_on_main是一个布局activty_main.xml

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

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

Fragment2Fragment1我们有 2 种方式显示

采用getFragmentManager()

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

采用getChildFragmentManager()

首先,我们必须创建一个 id container_view_on_fragment1inside的布局fragment1.xml,然后

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

结论

在这个演示中,我认为我们应该使用getFragmentManager()when go from Fragment1to,Fragment2因为它简单且有利于性能(打开Fragment1时会停止Fragment2

我们什么时候用getChildFragmentManager()
例如,您MainActivity有一个ViewPager3 页,在每个页面内您需要替换一些片段。

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

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

于 2017-11-29T04:00:12.343 回答
5

如果你想要一个片段作为片段的容器,你必须使用片段的 getChildFragmentManager 方法。如果您使用 getSupportFragmentManager,您基本上将使用片段管理器,它的行为方式与活动生命周期的方式相同,而不是您的片段方式。

例如,我有一个包含 ViewPager 的片段——它被称为 CollectionsFragment。所以我有 3 个片段显示为其中的选项卡:AllCollectionsFragment、MyCollectionsFragment、FavouriteCollectionsFragment。我将 getActivity().getSupportFragmentManager() 给了我正在使用的 FragmentStatePagerAdapter。

所以这导致了以下行为 - 3 个选项卡片段的 onDestroyView/onDestroy/onDetach/onStop 方法不被调用。当我改为使用 getChildFragmentManager 时,一切正常。

如果您愿意,可以查看文档以了解这两种方法:

getChildFragmentManager():返回一个私有的 FragmentManager,用于在这个 Fragment 内部放置和管理 Fragment。

getSupportFragmentManager():返回 FragmentManager 用于与与此 Fragment 的活动关联的 Fragment 进行交互。

于 2019-05-03T04:40:50.203 回答