getSupportFragmentManager()和getChildFragmentManager()有什么区别?

Nin*_*der 64 android android-fragments android-listfragment

我的类继承了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();
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Dee*_*eeV 134

定义getChildFragmentManager()是:

返回一个私有FragmentManager,用于放置和管理此Fragment中的Fragment.

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

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

基本上,区别在于Fragment现在有自己的内部FragmentManager可以处理Fragments.子FragmentManager是处理仅包含在其中的片段中的片段的片段.另一个FragmentManager包含在整个中Activity.

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

  • 我尝试使用getChildFragmentManager.但它也显示了同样的例外 (3认同)

Pha*_*inh 14

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());
Run Code Online (Sandbox Code Playgroud)

Fragment2Fragment1我们有2路显示

使用 getFragmentManager()

getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
Run Code Online (Sandbox Code Playgroud)

使用 getChildFragmentManager()

首先,我们要创建一个ID布局container_view_on_fragment1里面fragment1.xml,然后

getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();
Run Code Online (Sandbox Code Playgroud)

结论

在这个演示中,我认为我们应该在使用getFragmentManager()时使用Fragment1,Fragment2因为它简单且对性能有益(Fragment1Fragment2打开时会停止)

我们用的时候getChildFragmentManager()
例如你MainActivity有一个ViewPager有3页的页面,你需要在每个页面内替换一些片段.

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

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


Vin*_*tti 5

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

\n\n

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

\n\n

因此,这导致以下行为 \xe2\x80\x93 3 个选项卡片段的 onDestroyView/onDestroy/onDetach/onStop 方法不被调用。当我更改为使用 getChildFragmentManager 时,一切正常。

\n\n

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

\n\n

getChildFragmentManager():\n返回一个私有 FragmentManager,用于在此 Fragment 内放置和管理 Fragments。

\n\n

getSupportFragmentManager():\n返回 FragmentManager,以便与与此 Fragment\xe2\x80\x99s 活动关联的片段进行交互。

\n