问题标签 [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.
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 和最新方法实现这一点的信息,并愿意分享,我将不胜感激。
谢谢。
android - Android导航组件性能问题
所以我最近迁移到导航组件(2.2.0-alpha01)。当我在高端设备上工作时,我并没有真正注意到任何减速,但是当我完成后,测试人员开始报告应用程序导航缓慢。
在我的导航代码中,我使用findNavController().navigate(CustomFragmentDirections.actionEtc())或findNavController().popBackStack(fragmentId, false) 之类的调用,我还使用带导航的 safeargs。在我的导航 xml 中,我的操作严重依赖popUpTo和app:launchSingleTop="true"
为了调查,我在 BaseFragment 类中制作了非常基本的分析器:
我尝试使用 android studio profiler 进行分析,但并没有真正注意到任何异常。我也尝试了window.addOnFrameMetricsAvailableListener但它几乎给了我与我的探查器代码相同的结果。重要性的主要方法是onFrameRendered。基本思想是让布局膨胀和渲染,并在屏幕渲染后立即计算自调用 onResume 以来经过的毫秒数。
我尝试了不同的设备并且时间不是很一致,但是在多次测量相同的转换之后,我注意到一些趋势,与以前使用简单 supportFragmentManager 事务的应用程序导航相比,我所有的布局现在需要几乎两倍的时间来加载。
我尝试将导航从一个片段隔离到另一个片段,但我总是会得到这种糟糕的性能。
目前我知道这与导航切换片段的方式有关,因为如果我用我直接使用 FragmentManager 的自定义代码模拟 NavController,我会获得与旧代码相同的良好性能。如果我能找到确切的问题,将更新问题。
同时,有没有人知道可能出了什么问题?
android - 如何使用 Navigation Comp 为 Fragment 启用 Backstack。库
我的问题仅与谷歌导航组件库中的新库有关,因此它与 .addtobackstack 等常规片段无关。
我会简化我想做的事情,但我的应用程序有 +30 片段
我们有一个父片段和一个子片段,一个父片段有选项卡和回收器视图,数据来自 API。如果我单击 RV 项目将打开子片段。如果我回到我想要的父片段,我不想再次加载数据。
我的测试总是从头开始重新加载,创建视图然后加载数据,我希望它就像我们有意打开新活动时一样,父活动仍然有他自己的视图。
这是我的一些代码也许我有问题
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
,例如(我通过添加来解决这个问题
前
)但我认为我没有像我应该做的那样做导航部分......
您能否提供任何帮助以使这项工作更有效且稳定?
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 是未知的
任何帮助或指导都会非常有帮助。
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
(或只是默认值)
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 的工具栏也不同
android - Android Room Database 正在更新,但在返回 Fragment 时未发送更新
固定的
如果一张图片值 1000 个字,那么一个视频就值很多字。这是该问题的视频解释。
我已经包含了一个视频,因为它使事情变得更加清晰。问题:当我第一次加载包含需要切换状态的项目列表的片段时,我可以很好地切换该状态。我将更新发送到 Room 数据库,然后将更改发送回我的 ViewModel,然后 ViewModel 将它们分派到 Fragment。
但是,当我离开片段并返回时,不再分派更改。我不知道我是否在做一些非常愚蠢的事情,或者这是一个错误。
如果相关的话,我也在使用 Jetpack Navigation 组件。我将在下面包含代码。
如果您需要查看下面引用的任何其他代码,请告诉我,我会将其添加到问题中。
非常感谢您的时间和考虑。