首页 > 解决方案 > 片段是不可见的,但可以点击它的视图

问题描述

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 适配器作为点击处理程序。我使用 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 的视图。如何处理这个问题?是否有更好的做法来完成保存最后一个状态?

EDIT FragmentA 包含一些排序、过滤。当我使用 replace() 方法时,用户设置的所有过滤器都无效,并且 RecyclerView 位置也变为 0。想象用户正在查看(例如)列表中的 33. 项目,单击它,附加 FragmentB,然后转到回到片段A。我希望用户从 33. 项目继续,不希望用户尝试查找他所在的位置。

标签: javaandroidandroid-fragments

解决方案


我不确定您所说的“我想保存 FragmentA 的最后一个状态”是什么意思,但是,AFAIK,您在容器中替换 Fragments 的事实并不意味着它们会丢失状态。例如,您仍然可以单击后退按钮,这将恢复事务,将前一个 Fragment 从返回堆栈中取出。

编辑:您观察到的效果很可能是由 Fragment 的 View 层次结构的破坏和重新创建引起的。有几种方法。第一个是存储 UI 状态并在片段重新初始化后恢复它​​。不幸的是,RecyclerView 的位置可能很棘手(你可以用谷歌搜索)。另一种更简单的方法(这是一种 hack)是只创建onCreateView一次根视图,在 Fragment 中保留对它的引用,并在后续调用onCreateView. 如果您决定使用后一种方法,请小心,因为您使用的 Fragments 并不完全按照预期的方式使用。

与您的问题没有直接关系,但我绝对建议避免手动片段管理。会太痛苦的。您可以使用官方的导航组件,或者使用更简单的解决方案,例如 FragNav 库。我写了这篇关于后者的帖子,它可能会对你有所帮助。


推荐阅读