findFragmentById始终返回null

时间:2012-05-31 12:31:08

标签: 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"
...

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

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();

这一切都很好。替换碎片并且也在工作。

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

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);

这样做导致myFragment成为null。总是

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

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment");
fragmentTransaction.commit();

...

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");

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

9 个答案:

答案 0 :(得分:42)

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

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

答案 1 :(得分:10)

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

<FrameLayout
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

答案 2 :(得分:4)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"

它应该是fragment而不是LinearLayout

<fragment android:name="com.example.yourfragment"
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

答案 3 :(得分:4)

我在调用android.support.v4.app.Fragment时在我的布局中使用getFragmentManager()实际上搜索了android.app.Fragment子类,我得到null。 所以解决方法是改为调用getSupportFragmentManager()

一般情况下,确保您在布局中继承和使用的片段包与执行搜索的相应FragmentManager返回的相同。

答案 4 :(得分:2)

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

当片段从xml中膨胀时,您可以对片段进行定义和ID,如此示例http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding

答案 5 :(得分:1)

或者,您应该使用:

(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container);

答案 6 :(得分:0)

java.lang.AssertionError: 
Expected :1
Actual   :0

将容器ID用作片段ID。然后检查空引用。

答案 7 :(得分:0)

上面提到的原因是有效的,但另一个可能的原因是您试图在一个片段中搜索该片段,这也会导致fragmentManager.findFragmentById返回null。我们应该使用childFragmentManager.findFragmentById在片段中找到片段。 根据官方文件。

public final androidx.fragment.app.FragmentManager getChildFragmentManager()

  

返回一个私有的FragmentManager来放置和管理Fragments   在该片段的内部。

答案 8 :(得分:-1)

  

fragmentTransaction.add(R.id.fragment_container,myFragment);

     

MyFragment myFragment =(MyFragment)getFragmentManager()。findFragmentById(R.id.test_fragment);

请注意区别。

你应该将R.id.fragment_container作为参数传递给findFragmentById,然后将其传递给add函数,而不是R.id.test_fragment

顺便说一下,根据这两个函数的内部实现,id可以是正确的 它的容器视图。