我有 fragment X、A、B,我正在使用导航架构组件在它们之间导航。
特定于 fragment A、B,但 fragment X 可以是任意的(C、D、...);
来自底部导航的 fragment A 和 B 及其“导航图标”始终在屏幕上,这意味着用户可以随时从任何 fragment (包括 A 和 B)转到 A 或 B:
X -> A -> B
X -> B -> A
A -> B -> X
A -> B -> A
//另一种方式
关于这个案例我的问题:
X -> A -> B -> A -> B -> ?
如果用户从 X
开始,到达 ?
并开始按“后退”按钮返回,他将抛出 A
,B
几次:
用户反击:
? -> B -> A -> B -> A -> X
但是我想从 backstack 中“排除” fragment ,如果它们已经在上面的话:
? -> A -> B -> X
如果用户导航:
X -> A -> B -> A
我想看看:
A -> B -> X
不是:
A -> B -> A -> X
我正在尝试使用 Pop To 来做到这一点,但它只能返回一个具体的 Fragment。我需要返回我开始的 X fragment ,而不是硬编码。包容和单顶不是讲究的。
我不确定我是否可以使用基本的导航组件来做到这一点,所以我需要你的建议。如果我做不到,我应该使用什么方式?有什么好的做法吗?
更新:
我正在使用全局点在 Fragment 之间导航。这就是我的导航的样子:
右|底部链是 X,我可以使用底部导航从其中的任何一个导航到未更改的 fragment 。它是单一 Activity 应用,为了导航我只使用:
//Using global points
findNavController(R.id.host).navigate(R.id.toLibrary)
最佳答案
以下解决方案采用 fragment 可见性技术,以便在 onBackPressed()
时管理 fragment Backstack
。
第一步
我们在每个 Fragment
被调用时为它分配一个标签,以便识别哪些 Fragment
已添加到 Backstack
并且是前辈。
通过下面的代码,我们将标签分配给将要进行交易的 Fragment
。
fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A OR Fragment_B OR Fragment_ANY, "A or B or ANY")
.addToBackStack(tag).commit();
请记住,您必须为您希望交易的任何 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
已经可见,并将用户重定向到相应的前任Fragment
。
例如:A -> B
或 A -> X
或 X -> B
我正在将此技术用于已发布的应用程序,一切都很好。
关于android - 在导航组件中包含来自 Backstack 的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780523/