这是这种情况。我在片段 A 中有一个列表视图,其中有一个无限列表,当用户到达底部时,该列表通过 Web 服务填充。
列表视图中的每个项目都有一个“查看更多”链接,可打开该项目的详细片段 B。
我正在使用 FragmentManager.replace() 方法和“addToBackStack”。(我是“替换”而不是“添加”,因为我在片段 A 中有我不想在片段 B 中显示的菜单项。我已经尝试了不同的方法来添加片段,而不是在打开时删除并尝试隐藏菜单项片段 B 已经工作,但以一些其他问题结束,所以我更喜欢使用替换")
假设用户正在查看列表中的第 25 项,然后打开详细信息片段。当用户然后点击后退按钮时,我希望用户继续在同一位置查看列表。
这很容易通过“添加片段”而不是“替换”来实现,因为片段从未被删除。使用“替换”时,片段会被删除,然后当被击退时,它将再次呈现(又名,将再次调用 onCreateView)
但是此时,已经为片段创建了视图,因为 FragmentManager.remove 仅从视图层次结构中删除视图,但不破坏片段。所以我“理论上”可以做这样的事情:
if(view == null){
//Create view
view = (ViewGroup) inflater.inflate(R.layout.news_list, container, false);
}
return view;
但在这种情况下,它会导致
java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。
所以,我的解决方案如下:
if(view == null){
view = (ViewGroup) inflater.inflate(R.layout.news_list, container, false);
} else {
((ViewGroup) view.getParent()).removeView(view);
}
return view;
这对我有用,但我不知道除了这个解决方案之外是否会有一些我现在没有看到的“隐藏”错误。
我想听听你的建议。提前致谢