我在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会这样做?我错过了什么吗?
答案 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可以是正确的 它的容器视图。