【问题标题】:Unclude fragment from Backstack using Navigation component在导航组件中包含来自 Backstack 的片段
【发布时间】:2021-04-05 00:41:48
【问题描述】:

我有片段 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

但我想从 backstack 中“排除”片段,如果它们已经在它上面:

? -> A -> B -> X

如果用户导航:

X -> A -> B -> A

我想看看:

A -> B -> X

不是:

A -> B -> A -> X

我正在尝试使用 Pop To 来实现,但它只能以一个具体的片段返回给我。我需要返回我开始的 X 片段,而不是硬编码。包容和单顶不是它。

我不确定我是否可以使用基本的导航组件来做到这一点,所以我需要你的建议。如果我做不到,我应该使用什么方法?有什么好的做法吗?


UPD:

我正在使用全局点在片段之间导航。我的导航是这样的:

右|下链是X,我可以使用底部导航从其中任何一个导航到未修改的片段。它是Single Activity 应用程序,我正在使用以下导航:

   //Using global points
   findNavController(R.id.host).navigate(R.id.toLibrary)

【问题讨论】:

  • 你得到答案了吗?或者我帮你。
  • 不,我不是。如果您能提供帮助,那就太好了。
  • 当然。但是让我仔细阅读你的问题。不用担心

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


【解决方案1】:

以下解决方案采用片段可见性技术,以便在onBackPressed() 时管理片段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

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

【讨论】:

  • 感谢您的回答。这很好,但我需要时间来仔细测试它,因为你的提议在我目前的逻辑上被打破了很多。我有单个活动应用程序,所以我对onBackPressed() 句柄或片段可见性检查有一些问题。我会测试它并写下结果。 =)
  • @KirstenLy 我确实使用单活动应用程序对其进行了测试,并且运行良好。任何问题都可以随时与我分享。
【解决方案2】:

在 fragmentTransaction 中,而不是使用 addToBackStack() 或 add(...) 使用 fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

【讨论】:

  • 哦,我没有使用fragmentTransaction。我添加了更多信息来提问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多