原因:java.lang.IllegalArgumentException 多个片段
Caused by: java.lang.IllegalArgumentException multiple fragments
我在这个问题上花了很多时间,我不知道问题在哪里。
我有 Activity 片段 A.
Fragment A 有第二个 Fragment B,B 有 Fragment C。
Activity: layout -> with R.id.container (放置下一个片段的地方)
A:布局 -> 使用 R.id.place_promo
B:布局 -> 使用 R.id.container_promo
C:布局有线性布局R.id.promo_container
我遇到了这个错误:
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f060109 (pl.xx.xx.xx:id/container_promo) for fragment FragmentxxxxOne{4252e858 #3 id=0x7f060109}
我以同样方式放入的所有片段:
getActivity()
.getSupportFragmentManager()
.beginTransaction()
.replace(container, fragment)
.commit();
有什么建议吗?
我不知道这个错误是什么时候出现的,因为它来自我的错误处理程序。
public abstract FragmentTransaction replace (int containerViewId, Fragment fragment)
Calls replace(int, Fragment, String) with a null tag.
从这里..
public abstract FragmentTransaction replace (int containerViewId, Fragment fragment, String tag)
Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.
Parameters
- containerViewId Identifier of the container whose fragment(s) are to be replaced.
- fragment The new fragment to place in the container.
- tag Optional tag name for the fragment, to later retrieve the fragment with FragmentManager.findFragmentByTag(String).
所以你要在容器中替换给定的片段实例.
你还说每个分片都是这样管理的
您的应用程序的工作原理是:
- 获取片段的ID。我们称它为“fragID”
- 转到容器视图,基于容器
- 根据“fragId”查找要替换的片段
- 删除找到的片段
- 添加新的片段项目
问题在于,当您只保留 REPLACING 片段时,您总是希望已经放置了一个片段。在根本没有片段的第一个 运行 上,replace 方法无法找到(第 3 点)给定的片段。
您应该期待 add fragments in first place, and only if you ever need it you should replace them, checking their existence beforehand ( tip: use FragmentManager's find 方法的另一种方法 )
更新
可能漏说了一件可能会把事情搞砸的事情。我不认为使用 activity.getSupportFragmentManager() 可能是嵌套片段的正确方法。这是将 first 片段添加到 activity 的正确方法。一旦你需要将第二个嵌套在第一个中,你需要调用第一个片段的 FragmentManager
否则,您只能将片段附加到 Activity
这会很好用,在 onCreateView() 方法中使用它
View rootView;
if (rootView != null) {
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null)
parent.removeView(rootView);
}
try {
rootView = inflater.inflate(R.layout.myride, container, false);
} catch (InflateException e) {
}
我在这个问题上花了很多时间,我不知道问题在哪里。
我有 Activity 片段 A.
Fragment A 有第二个 Fragment B,B 有 Fragment C。
Activity: layout -> with R.id.container (放置下一个片段的地方)
A:布局 -> 使用 R.id.place_promo
B:布局 -> 使用 R.id.container_promo
C:布局有线性布局R.id.promo_container
我遇到了这个错误:
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f060109 (pl.xx.xx.xx:id/container_promo) for fragment FragmentxxxxOne{4252e858 #3 id=0x7f060109}
我以同样方式放入的所有片段:
getActivity()
.getSupportFragmentManager()
.beginTransaction()
.replace(container, fragment)
.commit();
有什么建议吗?
我不知道这个错误是什么时候出现的,因为它来自我的错误处理程序。
public abstract FragmentTransaction replace (int containerViewId, Fragment fragment)
Calls replace(int, Fragment, String) with a null tag.
从这里..
public abstract FragmentTransaction replace (int containerViewId, Fragment fragment, String tag)
Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.
Parameters
- containerViewId Identifier of the container whose fragment(s) are to be replaced.
- fragment The new fragment to place in the container.
- tag Optional tag name for the fragment, to later retrieve the fragment with FragmentManager.findFragmentByTag(String).
所以你要在容器中替换给定的片段实例.
你还说每个分片都是这样管理的
您的应用程序的工作原理是:
- 获取片段的ID。我们称它为“fragID”
- 转到容器视图,基于容器
- 根据“fragId”查找要替换的片段
- 删除找到的片段
- 添加新的片段项目
问题在于,当您只保留 REPLACING 片段时,您总是希望已经放置了一个片段。在根本没有片段的第一个 运行 上,replace 方法无法找到(第 3 点)给定的片段。
您应该期待 add fragments in first place, and only if you ever need it you should replace them, checking their existence beforehand ( tip: use FragmentManager's find 方法的另一种方法 )
更新
可能漏说了一件可能会把事情搞砸的事情。我不认为使用 activity.getSupportFragmentManager() 可能是嵌套片段的正确方法。这是将 first 片段添加到 activity 的正确方法。一旦你需要将第二个嵌套在第一个中,你需要调用第一个片段的 FragmentManager
否则,您只能将片段附加到 Activity
这会很好用,在 onCreateView() 方法中使用它
View rootView;
if (rootView != null) {
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null)
parent.removeView(rootView);
}
try {
rootView = inflater.inflate(R.layout.myride, container, false);
} catch (InflateException e) {
}