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"
它应该是一个不是LinearLayout
的fragment
<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。