问题标签 [android-jetpack-navigation]

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 投票
0 回答
570 浏览

android - 如何使用 Android Kotlin 实现类似于 YouTube 和 Instagram 的正确导航

我很难在我的应用程序中实现正确的导航结构。我希望它的行为类似于 YouTube 和 Instagram 中的导航。我遇到的最大问题是 backstack 和片段娱乐。

我目前正在使用具有多个片段方法的单个活动。我有一个应用栏和底部导航视图,在主要活动中设置了 3 个菜单项。应用栏有一个菜单项,在选中时导航到用户配置文件片段,并且底部导航的每个菜单项在选中时导航到不同的根片段(主页、搜索和配置文件)。我还使用 google 的 firebase 数据库和 firestore 来存储用户数据(电子邮件、uid、密码等)和照片。

我尝试使用 supportFragmentManager.beginTransaction().replace 方式和 android jetpack 的导航架构,但都无法产生我需要的结果。

我能够使用 supportFragmentManager 方式导航到正确的目的地,但似乎无法实现正确的向后导航结构。我试图找到实现它的其他代码示例,但找不到任何可行的方法,并且这些示例中的很多都是 Java 代码中的旧版本,带有不推荐使用的方法,这使得在尝试转换为 kotlin 代码时变得困难。

喷气背包导航组件更容易使用,但我也无法让它正常运行。据我所知,当前导航不支持多个 backstacks,并且没有适当的向后导航结构,除非您添加此处提供的 NavigationExtensions 文件:https ://github.com/googlesamples/android-architecture-components/tree/master/导航高级示例。使用此示例,我遇到了以下问题:

1.向后导航不会回到原来保存的fragment状态,而是重新创建一个全新的fragment。

2.从应用栏导航到配置文件片段有效,但是当用户在片段内并再次按下它时会崩溃。

3.将一组默认参数传递给底部导航视图中的用户片段项目菜单。我最初将帐户配置文件片段绑定到底部导航菜单项(仍用于测试目的),并将登录用户的 uid 设置为默认参数。使用的片段(UserFragment)采用 uid 参数并使用它从 google 的 firebase 获取正确的信息。我以前可以通过使用常规的喷气背包导航组件(没有高级示例)并在 MainActivity 中添加以下代码来实现这一点:

然后在用户片段中,我使用此代码获取正确的 uid:

使用高级示例导航组件,我无法将此默认参数传递给用户片段。我不断收到类似“没有与此片段关联的导航控制器”的错误消息,并且应用程序崩溃了。

主要活动

用户片段

我的项目目前正在使用支持片段管理器进行设置,但我一直在使用它和导航组件之间来回尝试让事情正常进行。

我还有两个与底部导航相关的片段,但我只包含了我认为我的问题所在的相关代码。其他两个片段有一个用户个人资料图片,当用户点击它时,它会将用户导航到选定的个人资料。我对这些事务没有任何问题,因为我可以使用 setOnClickListener 方法轻松应用包和参数。

TL;博士

总结一切:我正在寻找一种方法来在我的应用程序中实现正确的导航流程。我在向后导航和不应该重新创建片段时遇到问题。我尝试过使用片段管理器和 android jetpack 导航组件,但都没有运气。如果有人有任何关于如何使用 android kotlin 和最新方法实现这一点的信息,并愿意分享,我将不胜感激。

谢谢。

0 投票
1 回答
548 浏览

android - Jetpack 导航组件:更新深层链接的底部导航栏

我正在一个示例应用程序中测试导航组件。我有一个带有三个片段的底部导航栏;比如说A,B和C。此外,C还有另一个与之相连的流程,就像这样;C -> C1 -> C2 -> C3 -> C. xml 定义中没有嵌套图。见图片。我还根据文档连接了底部栏。

运行应用程序并在应用程序中移动时一切正常,底部栏会更新所选项目。

但是,当添加深层链接以打开 C2 时,应用程序会打开 C2,但底部栏中的 A 仍处于选中状态。我错过了什么?是否应该有任何动作连接 A、B 和 C?

在此处输入图像描述

0 投票
0 回答
2068 浏览

android - Android导航组件性能问题

所以我最近迁移到导航组件(2.2.0-alpha01)。当我在高端设备上工作时,我并没有真正注意到任何减速,但是当我完成后,测试人员开始报告应用程序导航缓慢。

在我的导航代码中,我使用findNavController().navigate(CustomFragmentDirections.actionEtc())findNavController().popBackStack(fragmentId, false) 之类的调用,我还使用带导航的 safeargs。在我的导航 xml 中,我的操作严重依赖popUpToapp:launchSingleTop="true"

为了调查,我在 BaseFragment 类中制作了非常基本的分析器:

我尝试使用 android studio profiler 进行分析,但并没有真正注意到任何异常。我也尝试了window.addOnFrameMetricsAvailableListener但它几乎给了我与我的探查器代码相同的结果。重要性的主要方法是onFrameRendered。基本思想是让布局膨胀和渲染,并在屏幕渲染后立即计算自调用 onResume 以来经过的毫秒数。

我尝试了不同的设备并且时间不是很一致,但是在多次测量相同的转换之后,我注意到一些趋势,与以前使用简单 supportFragmentManager 事务的应用程序导航相比,我所有的布局现在需要几乎两倍的时间来加载。

我尝试将导航从一个片段隔离到另一个片段,但我总是会得到这种糟糕的性能。

目前我知道这与导航切换片段的方式有关,因为如果我用我直接使用 FragmentManager 的自定义代码模拟 NavController,我会获得与旧代码相同的良好性能。如果我能找到确切的问题,将更新问题。

同时,有没有人知道可能出了什么问题?

0 投票
0 回答
113 浏览

android - 如何使用 Navigation Comp 为 Fragment 启用 Backstack。库

我的问题仅与谷歌导航组件库中的新库有关,因此它与 .addtobackstack 等常规片段无关。

我会简化我想做的事情,但我的应用程序有 +30 片段

我们有一个父片段和一个子片段,一个父片段有选项卡和回收器视图,数据来自 API。如果我单击 RV 项目将打开子片段。如果我回到我想要的父片段,我不想再次加载数据。

我的测试总是从头开始重新加载,创建视图然后加载数据,我希望它就像我们有意打开新活动时一样,父活动仍然有他自己的视图。

这是我的一些代码也许我有问题

0 投票
3 回答
382 浏览

android - Android Studio 导航编辑器在片段上显示“模糊类型”

我正在尝试使用编辑器创建导航图,但不幸的是它在我所有可用的片段上都显示“模糊类型”。我尝试创建一个新片段,但仍然是同样的问题。

NAC 编辑

此问题导致编辑器不显示 XML 文件中可用的目标。

我已经清理了 AS 缓存并重新启动,但这并没有解决任何问题。我从头开始了一个新项目,似乎一切正常,所以我的项目配置中一定有一些东西会影响导航编辑器。

有没有人经历过类似的事情?任何线索可能会发生什么?

0 投票
1 回答
6584 浏览

android-jetpack - 如何在 Fragment 目标中添加 NavHostFragment?

我的目标是通过复杂的导航架构(我想)以最佳方式理解和使用导航组件。

为了制作全局上下文,我使用了一个包含 5 个项目的主 BottomNavigationBar。对于碎片关联的管理,我使用谷歌给出的示例:https ://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample 。

但我的情况比底栏要复杂一些。在底部栏启动的片段之一的目的地之一中,我有另一个 RecyclerView 菜单和一个片段容器,用于在片段之间导航。我把我的主要图表的重要部分放在这里:

以及带有底部栏的 xml 开始此图:

这是与 go 片段(目标)对应的图示例:

关联xml是:

现在,要导航到 go 屏幕,我只需使用

或者

但是当我在 Go 片段上时,我发现使用findNavController()的 navController 仍然是 mainFragment 之一。所以navigate()函数没有找到动作ID。为了解决这个问题,我不得不像这样在 GoFragment 中以编程方式更改 navHost:

然后用于navHostGoFragment!!.navController.navigate(R.id.action_to_firstGoFragment)在新容器中导航但是这样做,我的 firstFragment 被创建了两次(我可以在我的日志中看到它)并且会产生一些问题Cannot add the same observer with different lifecycles,例如(我通过添加来解决这个问题

)但我认为我没有像我应该做的那样做导航部分......

您能否提供任何帮助以使这项工作更有效且稳定?

0 投票
2 回答
6386 浏览

android - Androidx - 如何使用导航处理来自父片段的嵌套图片段?

在此处输入图像描述

这是场景: -

我有一个主活动,它具有根 NavGraph 并默认加载片段 A。如果我从片段 A 移动到片段 B,其中我有子片段和 TabLayout,因此用户可以在其中切换片段,为此我为片段 B 中的子片段创建了一个新的嵌套图。当我从片段移动时A 到 Fragment B ,能够在我的子 Fragment 中显示 Fragment C ,因为我在嵌套图中将 start Destination 设置为 Fragment C 。

现在的问题是-> onClicking Tab A or Tab B from parentFragment(Fragment B),我必须访问嵌套的 NavGraph 操作来替换 parentFragment 中的片段。但是遇到错误:-

java.lang.IllegalArgumentException:导航目的地 com.myapp:id/action_fragmentC_fragmentD 对此 NavController 是未知的

任何帮助或指导都会非常有帮助。

0 投票
0 回答
448 浏览

android - 使用 Safeargs 组件通过 BottomNavigationView 传递参数

我正在尝试在我的 Android 应用程序中使用 Navigation 和 SafeArgs 组件以及 BottomNavigationView,但我无法通过底部导航视图传递参数。

这是我的情况:

  • HomeActivity:托管所有片段并将用户ID传递给所有片段
    • FragmentA:检索用户ID并做一些事情..
    • 片段B:作为片段A
    • 片段C:作为片段A

在我的 HomeActivity 中,我设置了导航组件以在片段之间切换:

并通过以下方式传递用户 ID:

在 FragmentA 内部,我尝试使用FragmentAArgs.fromBundle(arguments!!).uid和委托属性获取数据,by NavArg()但我得到null(或只是默认值)

0 投票
2 回答
1700 浏览

android-architecture-components - 如何使用 jetpack 导航库在两个活动之间导航

我正在开发一个简单的应用程序来测试 Android 中的 JetPack Navigation。我的应用程序有两个活动“Activity1”和“Activity2”。我知道 Jetpack 导航仅适用于 SingleActivity 应用程序,但我想看看是否有任何解决方案可以解决我的问题。应用程序以“Activity1”开头。下面是导航xml

导航图供参考

下面是来自 ActivityB 的代码

在 ActivityB 中获取 safeArgs 的代码

这是我的问题。1. 如何使用 jetpack Navigation 从 ActivityB(FragmentB1) 导航到 ActivityA(FragmentA2)。2.有没有办法通过android中的任何Manager Classes访问backStack?

为什么我需要两个活动? 作为 ActivityA 一部分的 FragmentA1、FragmentA2 和 FragmentA3 不应该有任何底部导航和抽屉布局。根据在这些片段中选择的答案,ActivityB 中会显示底部导航和抽屉布局。在 ActivityB 上的任何位置按下后退按钮时,ActivityA 应该与 FragmentA3 一起活跃起来。ActivityA 和 ActivityB 的工具栏也不同

0 投票
1 回答
571 浏览

android - Android Room Database 正在更新,但在返回 Fragment 时未发送更新

固定的

见下文

如果一张图片值 1000 个字,那么一个视频就值很多字。这是该问题的视频解释。

我已经包含了一个视频,因为它使事情变得更加清晰。问题:当我第一次加载包含需要切换状态的项目列表的片段时,我可以很好地切换该状态。我将更新发送到 Room 数据库,然后将更改发送回我的 ViewModel,然后 ViewModel 将它们分派到 Fragment。

但是,当我离开片段并返回时,不再分派更改。我不知道我是否在做一些非常愚蠢的事情,或者这是一个错误。

如果相关的话,我也在使用 Jetpack Navigation 组件。我将在下面包含代码。

如果您需要查看下面引用的任何其他代码,请告诉我,我会将其添加到问题中。

非常感谢您的时间和考虑。

显示片段

秀道

显示视图模型