java - 片段是不可见的,但可以点击它的视图
问题描述
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. 项目继续,不希望用户尝试查找他所在的位置。
解决方案
我不确定您所说的“我想保存 FragmentA 的最后一个状态”是什么意思,但是,AFAIK,您在容器中替换 Fragments 的事实并不意味着它们会丢失状态。例如,您仍然可以单击后退按钮,这将恢复事务,将前一个 Fragment 从返回堆栈中取出。
编辑:您观察到的效果很可能是由 Fragment 的 View 层次结构的破坏和重新创建引起的。有几种方法。第一个是存储 UI 状态并在片段重新初始化后恢复它。不幸的是,RecyclerView 的位置可能很棘手(你可以用谷歌搜索)。另一种更简单的方法(这是一种 hack)是只创建onCreateView
一次根视图,在 Fragment 中保留对它的引用,并在后续调用onCreateView
. 如果您决定使用后一种方法,请小心,因为您使用的 Fragments 并不完全按照预期的方式使用。
与您的问题没有直接关系,但我绝对建议避免手动片段管理。会太痛苦的。您可以使用官方的导航组件,或者使用更简单的解决方案,例如 FragNav 库。我写了这篇关于后者的帖子,它可能会对你有所帮助。
推荐阅读
- r - 如何构建表格以捕获更改
- vpn - OSMC pi 3b+ 无法让 cron 在启动时运行 expressvpn
- python - 如何修改字符串值并将它们转换为 int、bool 等?
- typescript - TypeScript 中的命令和响应泛型
- swift - Swift + Firestore:如何获取相关对象
- laravel - Laravel 关系过滤器按 company_id
- bash - Bash:将不同的参数列表传递给函数
- delphi - 按下 ListView 项目标题中的附件按钮
- c - 将结构转换为 uint8_t * 或 char * 并通过字节流访问它有多安全?
- oracle - 为什么从 Oracle 中的某个表读取比同一数据库中的其他表慢