android - 使用导航组件从 Backstack 中排除片段
问题描述
我有片段 X、A、B,并且我正在使用导航架构组件在它们之间导航。
片段 A,B 特定,但片段 X 可以是任何(C,D,...);
底部导航中的片段 A 和 B 及其“导航图标”始终在屏幕上,这意味着用户可以随时从任何片段(包括 A 和 B)转到 A 或 B:
X -> A -> B
X -> B -> A
A -> B -> X
A -> B -> A
//another ways
我对这个案例的问题:
X -> A -> B -> A -> B -> ?
如果用户从 开始X
,到达?
并通过“返回”按钮开始返回,他会A
多次B
投掷:
用户回击:
? -> B -> A -> B -> A -> X
但是如果它们已经在后台堆栈中,我想从后台“排除”片段:
? -> A -> B -> X
如果用户导航:
X -> A -> B -> A
我想看看:
A -> B -> X
不是:
A -> B -> A -> X
我正在尝试使用 Pop To 来做到这一点,但它只能以一个具体的片段返回给我。我需要返回我开始的 X 片段,而不是硬编码。包容性和单顶不是关于它的。
我不确定我是否可以使用基本的导航组件来做到这一点,所以我需要你的建议。如果我做不到,我应该使用什么方法?有什么好的做法吗?
升级版:
我正在使用全局点在片段之间导航。这就是我的导航的样子:
右|下链是 X,我可以使用底部导航从其中任何一个导航到未更改的片段。它是Single Activity 应用程序,导航我只使用:
//Using global points
findNavController(R.id.host).navigate(R.id.toLibrary)
解决方案
以下解决方案采用片段可见性技术来管理片段Backstack
。onBackPressed()
第一步
Fragment
我们在每个被调用和调用时为其分配一个标签,以便识别哪些Fragment
s 已被添加到Backstack
并且是 前辈。通过下面的代码,我们将标签分配给Fragment
将要进行交易的 a。
fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A OR Fragment_B OR Fragment_ANY, "A or B or ANY")
.addToBackStack(tag).commit();
请记住,您必须为要进行 Transacted 的任何 Fragment 分配一个标签。
在第二
我们要去处理public void onBackPressed()
。
您必须忽略super.onBackPressed()
因为,我们不想在按下后退按钮时使用默认 onBackPressed
方法来影响 Backstack(原样)。此外,我们想自己处理 Backstack。
干得好
@Override
public void onBackPressed() {
if(isVisible("A")) { //Go some where else you wanna go }
else if(isVisible("B")){ //Go some where else you wanna go }
else if(isVisible("X or any"){ //Go some where else you wanna go }
else { //Go default page }
}
public boolean isVisible(String tag){
try {
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null && fragment.isVisible())
return true;
else
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
当按下后退按钮时,我们检查哪个Fragment
已经可见并将用户重定向到相应的 Predecessor Fragment
。
例如:A - > B
或A -> X
或X -> B
我正在将此技术用于已发布的应用程序,一切都很好。
推荐阅读
- python - 如何在 Python 中可视化空间农艺数据?
- android - Android解密WRONG_FINAL_BLOCK_LENGTH(用Python加密的文件)
- swift - WKInterfaceTable 中的 WKLongPressGestureRecognizer
- amazon-web-services - 从其他用户访问 SNS 主题
- google-apps-script - 高级日历服务不发送电子邮件邀请
- android - Xamarin Android 通知仅工作一次
- sql - 有没有办法创建一个接受两个字符串数组并将这些字符串作为两个参数传递给函数的 UDF?
- angular - 如果为 mat-tab-group 设置了 [backgroundColor] 属性,则子控件会丢失波纹效果
- php - 使用 html2canvas 和 php 将 div 数据转换为图像
- c# - C# 使用 UTC 时获取正确的刻度