如何解决片段是不可见的,但可以单击其视图
我正试图使用户能够在单击列表项时转到新的Fragment
。没关系。我创建了一个接口,该接口使我可以处理 FragmentA.java 类中的单击事件。活动开始时, FragmentA 会附加到我的活动中。我的活动扩展了FragmentActivity
。
在我的活动课中:
@Override
protected void onCreate(Bundle savedInsantaceState){
//...
getSupportFragmentManager().beginTransaction().replace(R.id.container,FragmentA.newInstance(param1,param2)).commit();
}
然后在FragmentA.java中,将其设置为RecyclerView Adapter作为单击处理程序。我使用add()方法而不是replace()方法来更改片段,因为我想在附加FragmentB时保存FragmentA的状态(例如RecyclerView位置等)。
private void setListeners(){
mAdapter.setOnItemClickListener(itemClickListener);
}
private ItemListAdapter.ItemClickListener itemClickListener = new ItemListAdapter.ItemClickListener() {
@Override
public void onItemClicked(View v,ItemModel item) {
FragmentManager manager =((FragmentActivity)mActivity).getSupportFragmentManager();
manager.beginTransaction().add(R.id.post_activity_layout_container,FragmentB.newInstance(item,param2,param3)).addToBackStack("comment").commit();
}
};
这是问题所在:在这种情况下,FragmentA正在运行,但看不见,而用户看到了FragmentB。用户可以访问FragmentA的视图,这会引起问题。我想保存FragmentA的最后状态,但用户不应单击FragmentB上FragmentA的视图。如何处理这个问题?是否有更好的方法来完成保存最后一个状态?
编辑 FragmentA包含一些排序,过滤。当我使用replace()方法时,该用户设置的所有过滤器均无效,并且RecyclerView的位置也变为0。想象一下,用户正在查看(例如)列表中的33。单击该项目,附加了FragmentB,然后转到回到FragmentA。我希望用户从33. item继续,不希望用户尝试找到他所在的位置。
解决方法
我不确定您所说的“我想保存FragmentA的最后一个状态”是什么意思,但是AFAIK,您在容器中替换Fragments并不意味着它们会丢失状态。例如,您仍然可以单击“后退”按钮,这将还原事务,从而将前一个Fragment从后退堆栈中移出。
编辑:您观察到的效果很可能是由Fragment的View层次结构的破坏和重新创建引起的。周围有几种方法。第一个是存储UI状态,并在重新初始化Fragment之后恢复状态。不幸的是,使用RecyclerView位置可能会比较棘手(您可以在Google上搜索它)。另一种更简单的方法(这是一种技巧),是仅在onCreateView
中创建根View,在Fragment中保留对其的引用,并在随后对onCreateView
的调用中返回相同的View。如果您决定使用后一种方法,请当心,因为您将使用的片段与预期使用的方式不完全相同。
与您的问题没有直接关系,但我绝对建议您避免手动进行碎片管理。太痛苦了。您可以使用官方的导航组件,也可以使用更简单的解决方案,例如FragNav库。我写了this post关于以后的内容,可能会对您有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。