我正试图使用户能够在单击列表项时转到新的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继续,不希望用户尝试找到他所在的位置。
答案 0 :(得分:2)
我不确定您所说的“我想保存FragmentA的最后一个状态”是什么意思,但是AFAIK,您在容器中替换Fragments并不意味着它们会丢失状态。例如,您仍然可以单击“后退”按钮,这将还原事务,从而将前一个Fragment从后退堆栈中移出。
编辑:您观察到的效果很可能是由Fragment的View层次结构的破坏和重新创建引起的。周围有几种方法。第一个是存储UI状态,并在重新初始化Fragment之后恢复状态。不幸的是,使用RecyclerView位置可能会比较棘手(您可以在Google上搜索它)。另一种更简单的方法(这是一种技巧),是仅在onCreateView
中创建根View,在Fragment中保留对其的引用,并在随后对onCreateView
的调用中返回相同的View。如果您决定使用后一种方法,请当心,因为您将使用的片段与预期使用的方式不完全相同。
与您的问题没有直接关系,但我绝对建议您避免手动进行碎片管理。太痛苦了。您可以使用官方的导航组件,也可以使用更简单的解决方案,例如FragNav库。我写了this post关于以后的内容,可能会对您有所帮助。