问题标签 [android-navigation-graph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1000 浏览

android - 使用 NavigationUI 设置工具栏

我正在尝试为既没有底部导航也没有抽屉的简单导航 UI 设置工具栏。

这是我的主要活动布局的代码。

MainActivity 的代码

导航图是

和读者片段是

我已经通过设置设置了自定义工具栏

现在,如果我运行该项目,它将仅显示带有阅读器文本的工具栏,并且未加载阅读器片段,并且回收器视图中不显示任何内容。

在此处输入图像描述

但是如果我只是在活动布局文件中注释工具栏并将活动中的 onCreate 方法更改为以下

然后像这样可以看到回收站视图

在此处输入图像描述

但我想要回收器视图和工具栏,我还想自定义工具栏,有点像自定义字体。有人可以指导我吗。

谢谢

0 投票
1 回答
1033 浏览

android - 如何使用导航 ui 组件中的底部工作表对话框

我正在使用导航图进行内部导航。现在我想使用 nav_graph 打开一个底部工作表对话框片段。

我尝试添加

但是当我启动它时,我的应用程序崩溃了。崩溃报告

0 投票
1 回答
1640 浏览

android - 如何在几个已经创建的片段中更改 defaultNavHost?

我的活动中有几个片段,每个片段都有自己的Navigation Graph,它们是在创建活动时创建的。我想知道的是如何选择它们中的任何一个作为它们被创建之后defaultNavHostPrimaryNavigationFragment之后?

下面的代码创建它们并将它们设置为默认值,但我不想每次都重新创建它们。我怎样才能做到这一点?

0 投票
2 回答
191 浏览

android - Android Navigation Graph 继续 api 调用问题

我在我的android项目中使用了导航图。在我的项目中,底部导航视图中包含3个片段注册、登录和主页片段。在主页片段中调用api来获取记录列表。当我每次导航该片段时,它都会调用api。我想在第一次导航时调用该 api。关闭并重新打开应用程序后,它调用 api。如何使用带有 MVVM 架构的导航图来实现此功能?

0 投票
2 回答
1735 浏览

android - 如何使用共享的 ViewModel,并避免每次与导航组件重用它的同一个实例

我的应用由一个Activity和多个组成Fragments,遵循“单个 Activity 应用模型”,因此我可以使用Navigation ComponentAndroid 中的 正确导航jetpack

我的大多数屏幕 ( Fragments) 都是独立的,不相互依赖,因此它们使用自己的ViewModel

有些功能需要涉及多个导航Fragment。由于这些功能在它们之间共享通过 来回传递的数据Fragments,因此我使用共享的 ViewModel(如 Google 推荐的那样)。我需要ViewModel在所有关联中使用相同的共享实例Fragments,因为我需要Fragments共享共享的状态ViewModel

ViewModel要在这些关联中使用相同的实例Fragments,我需要在从以下获取时创建ViewModel使用父级Activity(而不是Fragment):ViewModelViewModelProviders

但是,这可行,它会产生一个问题:当连续导航到Fragment需要 shared的第一个时ViewModelViewModelProviders.of()将返回与ViewModel以前相同的实例:在ViewModel之间共享Fragments,但也在不同导航之间实现了类似的功能这个。

我理解为什么会发生这种情况(Android 将 ViewModel 存储在 a中,在请求withmap时正在使用它),但我不知道我应该如何正确实现“共享 ViewModel 模式”。ViewModelViewModelProviders.of()

我看到的唯一解决方法是:

  • 为使用共享Activity功能的功能创建一个不同的FragmentViewModel
  • 使用嵌套,并为使用共享的功能Fragments使用公共父级FragmentFragmentViewModel

使用这两个选项,我将能够创建一个ViewModelFragments在功能干预之间共享,并且每次导航到该功能时都会有所不同。

我在这里看到的问题是,这似乎Navigation Component与单个Activity应用程序的基本原理背道而驰。以这种方式实现的每个功能都需要具有不同的导航图,因为它们将使用不同的导航主机。这会阻止我使用Navigation Component.

实现我想要的正确方法是什么?我错过了什么,还是它就是这样?

之前Navigation Component我会使用不同的ActivitiesandFragments和使用与/Dagger关联的范围来实现这一点。但我不确定只用一个 Activity 来实现它的最佳方法是什么ActivityFragment

0 投票
2 回答
4792 浏览

android - 使用导航组件将参数安全地传递给嵌套图

我正在使用 Android Jetpack 导航组件。我有一个带有 id 的嵌套导航图,比如嵌套图R.id.nested_graph 的第一个Fragment接收一个参数。

如何使用安全 args将参数传递给嵌套图?

目前,我需要在包中手动传递参数,使用直接接收嵌套图 id 的 API:

我想使用安全的参数,并执行以下操作:

但是在尝试这样做时,我在构建时收到以下错误:

问题是导航图预处理正在生成工厂方法来创建NavDirections对象,而签名中没有所需的参数。

嵌套图的声明如下所示:

0 投票
1 回答
262 浏览

android - Android NavigationUI startDestination 类(不是 ID)以编程方式

我需要根据条件以编程方式设置导航图的起始目的地我有 Fragment0,还有 Fragment1、Fragment2、... FragmentN 都扩展了 Fragment0,并且所有这些(包括 Fragment0)都能够成为希望的起始目的地

我已经知道有来自 NavGraph 的方法称为

但这对我没有用,因为如果我没记错的话,它需要在 xml 导航文件中声明所有这些fragment0...N节点。

所以,我想要的是,在 xml 文件中只有一个片段节点,并且能够以编程方式设置类(在我的例子中是一个片段),在正常情况下,您可以通过设计/文本选项卡指示android studio 并显示如下:

0 投票
5 回答
4099 浏览

android - Android 导航组件活动意图标志

我已经创建了从片段到活动的导航操作,但我无法清除后台堆栈。当我执行从片段到新活动的导航操作并按下后退按钮时,我会回到上一个活动和上一个片段。我无法使用导航图设置 Intent 标志来清除后台堆栈中的先前活动。

从片段导航到新活动时, PopToInclusive标志对后退按钮没有影响,即使它们可以在图形编辑器中设置。我可以使用后退按钮导航到堆栈中不再需要的上一个活动。

在迁移到导航图之前,我可以使用 Intent 标志指定此行为:

如何使用导航图实现相同的目标?

0 投票
1 回答
2679 浏览

android - 未使用导航组件将片段添加到后台堆栈

信息:

我以编程NavHostFragment方式为应用程序的每个功能插入一个。每个NavHostFragment都有自己的导航图。Dagger 通过使用FragmentFactory特定于每个功能的特性来提供它们。它是具有 MVVM 架构的Single Activity结构。

回购:https ://github.com/mitchtabian/DaggerMultiFeature/tree/nav-component-backstack-bug

签出分支“nav-component-backstack-bug”。


问题

导航到图表时,片段不会被添加到后台堆栈。添加的唯一片段是最近访问过的片段。因此堆栈大小始终保持为 1。

最初我认为这是因为我没有将其设置FragmentFactory为,ChildFragmentManager但这并没有改变任何东西。请参阅下面的代码片段以获取相关代码。或者签出项目并运行它。我有日志打印出当前在后台堆栈中的片段ChildFragmentManager,还有SupportFragmentManager. 两者的大小都为 1。


Feature1NavHostFragment.kt

这是习惯之一NavHostFragment。伴随对象中的create()函数是我创建它们的方式。


MainActivity.kt

这是我如何NavHostFragment在 MainActivity 中创建 's 的示例。


Feature1MainFragment.kt

这是我如何导航到图中的其他片段的示例。


概括

就像我说的,在每个片段中,我都在为ChildFragmentManager和打印 backstack SupportFragmentManager。两者都有一个恒定的大小。当我导航到图表而不是添加到堆栈中时,就好像片段正在被替换。

无论如何,感谢您阅读本文,我将不胜感激。

0 投票
1 回答
2745 浏览

android - BottomSheetDialogFragment 中的 NavigationComponent 导航

Android 的导航组件可以用于在底部表内导航(即在单个底部表中替换/添加片段)吗?

我知道如何在导航图中BottomSheetDialogFragment使用标签启动。<dialog>例如,下面nav_graph.xml允许用户从一个BottomSheetDialogFragment(fragmentOne) 导航到另一个BottomSheetDialogFragment(fragmentTwo)。FragmentTwo 在 FragmentOne 的 BottomSheet 上作为第二个 BottomSheet 打开。

但是,如果我想让 fragmentTwo 在同一个 BottomSheet 中替换 fragmentOne 怎么办?我将如何使用导航图完成此操作?

演示(这不是我想要的。我不想要一个底部表打开另一个底部表