如何使用导航组件获取上一个目的地?

11

我有碎片A、B、C和X,它们的导航如下所示。

 A --> X 
 B --> X 
 C --> X

我怎么知道X中最后或前一个目的地的信息?

可以通过以下方式找到当前目的地ID:

Navigation.findNavController(v).getCurrentDestination().getId()

我也尝试使用 getBackStackEntry(int destinationId),但它只返回特定目标ID的顶部 NavBackStackEntry。换句话说,当前目标。

此外,getActivity().getSupportFragmentManager().getBackStackEntryCount(); 返回 0。

可能的解决方案包括:

  1. 从 A、B 和 C 向 X 传递数据,并通过检查该数据来确定上一个片段。
  2. 使用共享 SharedViewModel。

是否可能获取当前目标?


1
为什么你不在发送位置时附带一些参数,以便你知道该位置属于哪个片段。 - Sai Jayant
或者你可以使用这些代码来确定你所在的片段,并更改你的首选管理器LastVistedFragment const。请参阅此代码 https://dev59.com/6VgQ5IYBdhLWcg3wLQuW#43658331 - Sai Jayant
你的解决方案很好,但应该有一些方法可以从片段中获取返回堆栈。@SaiJayant - Patriotic
你想要实现什么?你希望从B中获取的信息在X中吗? - Biscuit
在弹出回退栈时,当您返回到先前的片段时,我告诉您的方法也会更新当前显示的片段。 - Sai Jayant
除了从A、B和C发送源ID到X外,我还没有找到任何最好的解决方案来获取当前可见片段中的先前片段。感谢您的合作。 - Patriotic
2个回答

33

Java: Navigation.findNavController(v).getPreviousBackStackEntry().getDestination().getId();

Kotlin: findNavController().previousBackStackEntry?.destination?.id

这段代码应该会在 "X" fragment 中返回前一个目标的 id。


如果使用popupTo,我认为这将为空,只是提醒其他人知道。 - behelit

-3
添加目标更改监听器,并在返回键按下时将ID与A、B、C的ID进行比较。
NavController.OnDestinationChangedListener { controller, destination, arguments ->
    // react on change or 
    //you can check destination.id or destination.label and act based on that
)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接