findFragmentById总是返回null

我在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"); 

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

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

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

使用<FrameLayout>标签作为布局文件中的容器。 稍后要dynamicreplace活动中的片段,可以使用<FrameLayout>容器的IDreplace活动中的片段。

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

它应该是一个不是LinearLayoutfragment

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

我在我的布局中使用android.support.v4.app.Fragment ,同时调用getFragmentManager()实际上searchandroid.app.Fragment子类,我得到null 。 所以修正是调用getSupportFragmentManager()来代替。

一般来说,要确保你在布局中使用的片段的包是由相应的执行search的FragmentManager返回的。

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

你可以在一个片段上定义一个片段,当它从一个xml中膨胀时,就像这个样本http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding

或者,你应该使用:

 (MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container); 
 FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb); if(fragmentB != null) { fragmentB.showuserResponse(msg); } 

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

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

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

请注意区别。

您应该将R.id.fragment_container作为parameter passing给findFragmentById ,因为您将它传递给add函数,而不是R.id.test_fragment

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