标签: android-jetpack-navigation

使用 Compose Navigation 导航时 TopAppBar 闪烁

我有 2 个屏幕,它们都有自己的ScaffoldTopAppBar。当我使用 Jetpack Navigation Compose 库在它们之间导航时,应用程序栏会闪烁。为什么会发生这种情况以及我该如何摆脱这种情况?

在此输入图像描述

代码:

导航:

@Composable
fun TodoNavHost(
    navController: NavHostController,
    modifier: Modifier = Modifier
) {
    NavHost(
        navController = navController,
        startDestination = TodoScreen.TodoList.name,
        modifier = modifier
    ) {
        composable(TodoScreen.TodoList.name) {
            TodoListScreen(
                onTodoEditClicked = { todo ->
                    navController.navigate("${TodoScreen.AddEditTodo.name}?todoId=${todo.id}")
                },
                onFabAddNewTodoClicked = {
                    navController.navigate(TodoScreen.AddEditTodo.name)
                }
            )
        }
        composable(
            "${TodoScreen.AddEditTodo.name}?todoId={todoId}", 
            arguments = listOf(
                navArgument("todoId") {
                    type = NavType.LongType
                    defaultValue = -1L
                }
            )
        ) {
            AddEditTodoScreen(
                onNavigateUp = {
                    navController.popBackStack() 
                },
                onNavigateBackWithResult = { result …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-jetpack-navigation android-jetpack-compose android-jetpack-compose-scaffold

19
推荐指数
3
解决办法
4777
查看次数

禁用 Jetpack Compose 中的后退按钮

如何禁用 Jetpack Compose 中的后退按钮?我不希望用户返回到上一个屏幕。

我尝试了下面的代码,但用户仍然可以返回到上一个屏幕:

BackHandler(enabled = false) {
   // do nothing
}
Run Code Online (Sandbox Code Playgroud)

android-jetpack-navigation android-jetpack-compose

19
推荐指数
1
解决办法
8725
查看次数

如何使用新版本的撰写导航传递可打包参数?

我有一个用 jetpack compose 制作的应用程序,它工作得很好,直到我将 compose 导航库从版本2.4.0-alpha07升级到版本2.4.0-alpha08 在 alpha08 版本中,在我看来,该类arguments的属性NavBackStackEntry是 a val,所以它不能像我们在 2.4.0-alpha07 版本中那样重新分配。在2.4.0-alpha08版本中如何解决这个问题?

我的导航组件是这样的:

@Composable
private fun NavigationComponent(navController: NavHostController) {
    NavHost(navController = navController, startDestination = "home") {
        composable("home") { HomeScreen(navController) }
        composable("details") {
            val planet = navController
                .previousBackStackEntry
                ?.arguments
                ?.getParcelable<Planet>("planet")
            planet?.let {
                DetailsScreen(it, navController)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使导航发生在详细信息页面的部分是在这个函数中:

private fun navigateToPlanet(navController: NavHostController, planet: Planet) {
    navController.currentBackStackEntry?.arguments = Bundle().apply {
        putParcelable("planet", planet)
    }
    navController.navigate("details")
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过简单地应用到函数arguments的重复navigateToPlanet使用 …

android android-jetpack-navigation android-jetpack-compose

18
推荐指数
2
解决办法
2万
查看次数

android - 横向导航图流预览

Android jetpack 组件的导航图预览始终显示布局编辑器中屏幕的纵向视图。我们可以自定义它以在我们选择的模拟器上查看屏幕吗?

android android-jetpack android-architecture-navigation android-jetpack-navigation

16
推荐指数
1
解决办法
768
查看次数

Android 导航组件:以编程方式从与家不同的目的地开始?

我正在尝试根据github 示例实现navigation controller具有多个返回堆栈的多个BottomNavigationView。但是,该示例为每个选项卡使用了不同的导航图,这使事情变得简单。在我的情况下,我需要对所有选项卡使用相同的导航图,但起始目的地与导航图中设置的“主页目的地”不同。

到目前为止,我已经设法修改NavigationExtensions文件以实现所有选项卡的单个导航图,并且我获得了多个navControllers带有自己的后堆栈的导航图,但我无法弄清楚如何在不同的目的地启动导航图。

.navigate在获取导航控制器时尝试使用,但由于它还没有连接,所以它不起作用。关于如何实现这一目标的任何想法?谢谢你。

android android-architecture-navigation android-jetpack-navigation

15
推荐指数
2
解决办法
1万
查看次数

NavController.OnDestinationChangedListener 传递的 destination.id 与触发的导航操作 ID 不匹配

在我的 Android 项目中,我有一个非常简单的导航图,包括两个片段:Master 和 Detail:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   app:startDestination="@id/wordsListFragment">

    <fragment
        android:id="@+id/wordsListFragment"
        android:name="com.***.presentation.view.WordsListFragment"
        android:label="List"
        tools:layout="@layout/words_list_fragment">
        <action
            android:id="@+id/action_wordsListFragment_to_wordDetailsFragment"
            app:destination="@id/wordDetailsFragment" />
    </fragment>
    <fragment
        android:id="@+id/wordDetailsFragment"
        android:name="com.***.presentation.view.WordDetailsFragment"
        android:label="Details"
        tools:layout="@layout/word_details_fragment" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

导航本身在两个方向上都可以正常工作,包括“返回”行为。在那个项目中,我有一个活动,我在其中实施OnDestinationChangedListener. 所有这些都根据谷歌的以下文档:NavController 更新 UI

当用户单击列表项时(在主片段上),我调用以下方法:

findNavController().navigate(R.id.action_wordsListFragment_to_wordDetailsFragment, null)
Run Code Online (Sandbox Code Playgroud)

然后在父活动中,我有以下实现:

private fun setupNavController() {
    navigationController = findNavController(R.id.nav_mainhost_fragment_container)
    navigationController.addOnDestinationChangedListener(mainDestinationChangedListener)
    appBarConfiguration = AppBarConfiguration(navigationController.graph)
    setupActionBarWithNavController(navigationController, appBarConfiguration)
}
Run Code Online (Sandbox Code Playgroud)

那就是侦听器对象:

private val mainDestinationChangedListener = 
NavController.OnDestinationChangedListener { controller, destination, arguments ->        

if (destination.id == R.id.action_wordsListFragment_to_wordDetailsFragment) {
        actionBar?.hide()
    } else {
        actionBar?.show()
    }
}
Run Code Online (Sandbox Code Playgroud)

destination.id不匹配R.id.action_wordsListFragment_to_wordDetailsFragment

我已经尝试清理项目,清理IDE缓存,gradle缓存,但生成的标识符仍然不匹配。我还尝试通过 …

android android-jetpack-navigation

15
推荐指数
2
解决办法
4601
查看次数

Jetpack Compose 应用程序范围内的条件 TopAppBar 最佳实践

我有一个使用BottomNavigationTopAppBar可组合项的 Android Jetpack Compose 应用程序。从通过打开的选项卡,BottomNavigation用户可以更深入地导航到导航图。

问题

可组合项TopAppBar必须代表当前屏幕,例如显示其名称、实现一些特定于打开的屏幕的选项、后退按钮(如果屏幕是高级屏幕)。然而,Jetpack Compose 似乎没有现成的解决方案,开发人员必须自己实现。

因此,明显的想法伴随着明显的缺点,有些想法比其他想法更好。

正如 Google建议的那样(至少对于),跟踪导航的基线BottomNavigation是一个包含表示当前活动屏幕的 ssealed的类。object具体到我的项目,是这样的:

sealed class AppTab(val route: String, @StringRes val resourceId: Int, val icon: ImageVector) {
    object Events: AppTab("events_tab", R.string.events, Icons.Default.EventNote)
    object Projects: AppTab("projects_tab", R.string.projects, Icons.Default.Widgets)
    object Devices: AppTab("devices_tab", R.string.devices, Icons.Default.DevicesOther)
    object Employees: AppTab("employees_tab", R.string.employees, Icons.Default.People)
    object Profile: AppTab("profile_tab", R.string.profile, Icons.Default.AccountCircle)
}
Run Code Online (Sandbox Code Playgroud)

现在,只要我们提供了对象TopAppBar,就可以知道打开了哪个选项卡,但是它如何知道是否从给定选项卡中打开了屏幕?rememberAppTab

解决方案1 ​​- 明显且明显错误

我们为每个屏幕提供自己的TopAppBar并让它处理所有必要的逻辑。除了大量代码重复之外,每个屏幕TopAppBar都会在打开屏幕时重新组合,并且如 …

android kotlin android-jetpack-navigation android-jetpack-compose

15
推荐指数
1
解决办法
3002
查看次数

Android导航组件+登录流程+嵌套BottomNavigationView

我正在努力使用 Android 导航组件构建导航,如下图所示。

我需要一个“登录流程”,检查用户是否登录,然后导航到应用程序的主要部分(也清除后台堆栈)。主要部分包含一个带有三个选项卡的 BottomNavigationView。但是如果我点击工具栏上的设置图标,我也想显示一个全屏的 SettingsFragment。

我是否需要两个带有单独导航图的 NavHostFragment?如果是,我怎样才能将它们结合起来并有一个适当的反向导航?

任何想法如何使用android导航组件实现这样的导航?

在此处输入图片说明

android android-navigation android-bottom-nav-view android-jetpack-navigation

14
推荐指数
1
解决办法
2109
查看次数

使用导航组件的深层链接时如何重新创建 singleTop 行为?

使用导航组件的深层链接时如何重新创建 singleTop 行为?

我正在使用 Jetpack Navigation,目前正在尝试实现通知点击。其中一个片段用于播放音乐。当您将应用程序设为后台时,会显示一条通知并继续播放音乐。当我点击通知时,我想回到带有回放的片段。我想模仿singleTop行为。

为了处理通知点击,我使用了一个显式的深层链接(PendingIntent带导航图):

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.music)
    .setArguments(...)
    .createPendingIntent()
Run Code Online (Sandbox Code Playgroud)

不幸的是,它清除了任务返回堆栈并将其替换为深层链接目标。我怎样才能防止这种行为?我知道有,NavOptions#shouldLaunchSingleTop但我认为无法将它与PendingIntentand一起使用NavDeepLinkBuilder。是否可以使用 NavOptions 启动深层链接?

android-deep-link android-jetpack-navigation

14
推荐指数
0
解决办法
320
查看次数

Android studio build 导航组件出错,action 不是抽象的,也没有实现抽象的成员 actionID

不知何故,构建崩溃了,并出现了与导航组件相关的奇怪错误,尽管它以前可以工作,但错误出在生成的类中,就我而言 NativeLanguageSelectionFragmentDirections

这是错误

e: C:\Users\David\StudioProjects\android\app\build\generated\source\navigation-args\debug\com\linguistic\linguistic\framework\presentation\loginscreens\ui\main\NativeLanguageSelectionFragmentDirections.kt: (10, 16): Class 'GoToSelectLearningLangAction' is not abstract and does not implement abstract member public abstract val actionId: Int defined in androidx.navigation.NavDirections
e: C:\Users\David\StudioProjects\android\app\build\generated\source\navigation-args\debug\com\linguistic\linguistic\framework\presentation\loginscreens\ui\main\NativeLanguageSelectionFragmentDirections.kt: (13, 12): 'getActionId' overrides nothing
e: C:\Users\David\StudioProjects\android\app\build\generated\source\navigation-args\debug\com\linguistic\linguistic\framework\presentation\loginscreens\ui\main\NativeLanguageSelectionFragmentDirections.kt: (15, 12): 'getArguments' overrides nothing
Run Code Online (Sandbox Code Playgroud)

这是导航图的代码

e: C:\Users\David\StudioProjects\android\app\build\generated\source\navigation-args\debug\com\linguistic\linguistic\framework\presentation\loginscreens\ui\main\NativeLanguageSelectionFragmentDirections.kt: (10, 16): Class 'GoToSelectLearningLangAction' is not abstract and does not implement abstract member public abstract val actionId: Int defined in androidx.navigation.NavDirections
e: C:\Users\David\StudioProjects\android\app\build\generated\source\navigation-args\debug\com\linguistic\linguistic\framework\presentation\loginscreens\ui\main\NativeLanguageSelectionFragmentDirections.kt: (13, 12): 'getActionId' overrides nothing
e: C:\Users\David\StudioProjects\android\app\build\generated\source\navigation-args\debug\com\linguistic\linguistic\framework\presentation\loginscreens\ui\main\NativeLanguageSelectionFragmentDirections.kt: (15, 12): 'getArguments' overrides nothing
Run Code Online (Sandbox Code Playgroud)

我在用

 "androidx.navigation:navigation-fragment-ktx:2.3.5" …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-navigation

14
推荐指数
4
解决办法
2200
查看次数