android - Android - 从堆栈中间删除特定片段不起作用
问题描述
我想实现一个动态片段堆栈。更具体地说,例如假设以下堆栈:
A -> B -> C -> D
B 可能会在 D 之后再次添加。如果发生这种情况,我想删除 B,结果将是:
A -> C -> D -> B
我试着这样做:
void loadFragment(MyFragment f){
FragmentManager fm = getSupportFragmentManager();
MyFragment foundFragment = (MyFragment ) fm.findFragmentByTag(f.getClass().getName());
if(foundFragment!=null) {
fm.popBackStack(f.getTransactionId(), 0);
}
String tag = f.getClass().getName();
f.setTransactionId(tag);
fm.beginTransaction()
.addToBackStack(tag)
.replace(R.id.fragment_container, f, tag)
.commit();
}
所以我这样做:
loadFragment(A);
loadFragment(B);
loadFragment(A);
loadFragment(B);
然后我回击,将我降落到 A(到目前为止一切正常)
然后我再次回击,它再次将我降落到 A。(第二个 B 去了哪里???)
如果我再次回击,活动将关闭,因为没有更多碎片弹出。
我无法解释这...
我怎样才能达到预期的行为?
解决方案
首先加载片段 A。
然后你加载片段B。所以现在后面的堆栈看起来像A - B
不,您尝试再次加载 A。但是已经有一个带有相同标签的片段。所以你popBackStack直到最后一次出现 A(不包括 A)。然后你加载A。所以你的后栈现在看起来像A - A
最后,您加载 B。所以现在当您单击返回时,它会显示 A。当您单击返回时,它会再次显示 A。
推荐阅读
- javascript - 如何通过命名范围的验证在新列中设置值?
- java - 服务正在运行但线程已停止
- javascript - VueJs动态组件块(laravel-mix/webpack)加载url在我转到子页面后发生变化
- javascript - 从另一个页面中的一个服务的回调函数获取结果
- django - 当相同的数据和 URL 与 Postman (Django DRF React.js) 一起使用时,Axios 发布请求返回错误 400
- kubernetes - kubernetes - 无法加入主节点 - 错误执行阶段预检:无法验证 API 服务器的身份
- odoo-12 - 设置要添加的最大行数
- java - 使用 Firebase 登录 Google
- google-cloud-platform - 使用 URLPrefix 的 Google Cloud CDN 签名 URL
- blazor - Blazor 服务器在 60 秒后断开连接