android - 在导航组件中包含来自 Backstack 的 fragment

标签 android android-architecture-components android-architecture-navigation

我有 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 开始,到达 ? 并开始按“后退”按钮返回,他将抛出 AB 几次:

用户反击:

? -> 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 之间导航。这就是我的导航的样子:

enter image description here

右|底部链是 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 -> BA -> XX -> B

我正在将此技术用于已发布的应用程序,一切都很好。

关于android - 在导航组件中包含来自 Backstack 的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780523/

相关文章:

sqlite - 如何防止应用程序长时间保持后静态变量变为空

首次更新后 Android LiveData Observer 未激活

android - 条件 fragment 和导航重用

android - 使用 Android 导航组件进行有条件的后退导航

android - 反转ListView显示顺序

java - Android Studio无法在Fragment类和Thread之间传递TextView对象

java - 无法解析或不是字段

android - 是否可以在没有Factory的情况下在公共(public)方法中将id参数传递给AndroidViewModel?

android - 我应该让 AsyncTask 成为 LiveData 或 Repository 类的成员 - 作为 Loader 的替代品

Android Studio 3.2 金丝雀版本不呈现导航标签