findFragmentById始终返回null

Vip*_*per 56 android android-fragments

我在xml布局中为我的片段定义了一个ID:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"
...
Run Code Online (Sandbox Code Playgroud)

然后我在activity的onCreate方法中添加这个片段:

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

这一切都很好.替换片段并且也在工作.

后来我试图通过其中一个活动的方法中的ID来检索这个片段:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);
Run Code Online (Sandbox Code Playgroud)

这样做会导致myFragment成为现实null.总是.

当我尝试使用标签而不是ID时,我可以通过其标签检索片段而不会出现任何问题:

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment");
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

...

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");
Run Code Online (Sandbox Code Playgroud)

为什么findFragmentById找不到片段,但findFragmentByTag是这样做的?我错过了什么吗?

StE*_*rMi 42

R.id.test_fragment 不是您的片段的ID,而是LinearLayout的ID

调用add(int containerViewId, Fragment fragment)将添加没有标记的片段.所以,或者您使用add(int containerViewId, Fragment fragment, String tag)并使用标签取回片段(作为ID)

  • 这是一个有效的解决方法,但没有回答这个问题.查看文档以获得正确的描述.文档说,id是在从xml中膨胀片段时分配的,或者在使用事务添加时是容器ID ... http://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int ) (17认同)
  • 如果添加的片段没有id,你不能使用它所放置的容器的id找到它吗?我很确定这是件好事. (5认同)
  • 迈克T是对的.文档明确表示你应该能够在`getFragmentById()`中使用片段容器的ID. (4认同)

小智 10

<FrameLayout>标记用作布局文件中的容器.稍后,要动态替换活动中的片段,可以使用<FrameLayout>容器的ID 替换活动中的片段.

<FrameLayout
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)