我有 2 个屏幕,它们都有自己的Scaffold和TopAppBar。当我使用 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
如何禁用 Jetpack Compose 中的后退按钮?我不希望用户返回到上一个屏幕。
我尝试了下面的代码,但用户仍然可以返回到上一个屏幕:
BackHandler(enabled = false) {
// do nothing
}
Run Code Online (Sandbox Code Playgroud) 我有一个用 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 jetpack 组件的导航图预览始终显示布局编辑器中屏幕的纵向视图。我们可以自定义它以在我们选择的模拟器上查看屏幕吗?
android android-jetpack android-architecture-navigation android-jetpack-navigation
我正在尝试根据github 示例实现navigation controller具有多个返回堆栈的多个BottomNavigationView。但是,该示例为每个选项卡使用了不同的导航图,这使事情变得简单。在我的情况下,我需要对所有选项卡使用相同的导航图,但起始目的地与导航图中设置的“主页目的地”不同。
到目前为止,我已经设法修改NavigationExtensions文件以实现所有选项卡的单个导航图,并且我获得了多个navControllers带有自己的后堆栈的导航图,但我无法弄清楚如何在不同的目的地启动导航图。
我.navigate在获取导航控制器时尝试使用,但由于它还没有连接,所以它不起作用。关于如何实现这一目标的任何想法?谢谢你。
android android-architecture-navigation android-jetpack-navigation
在我的 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缓存,但生成的标识符仍然不匹配。我还尝试通过 …
我有一个使用BottomNavigation和TopAppBar可组合项的 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
我们为每个屏幕提供自己的TopAppBar并让它处理所有必要的逻辑。除了大量代码重复之外,每个屏幕TopAppBar都会在打开屏幕时重新组合,并且如 …
android kotlin android-jetpack-navigation android-jetpack-compose
我正在努力使用 Android 导航组件构建导航,如下图所示。
我需要一个“登录流程”,检查用户是否登录,然后导航到应用程序的主要部分(也清除后台堆栈)。主要部分包含一个带有三个选项卡的 BottomNavigationView。但是如果我点击工具栏上的设置图标,我也想显示一个全屏的 SettingsFragment。
我是否需要两个带有单独导航图的 NavHostFragment?如果是,我怎样才能将它们结合起来并有一个适当的反向导航?
任何想法如何使用android导航组件实现这样的导航?
android android-navigation android-bottom-nav-view android-jetpack-navigation
使用导航组件的深层链接时如何重新创建 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 启动深层链接?
不知何故,构建崩溃了,并出现了与导航组件相关的奇怪错误,尽管它以前可以工作,但错误出在生成的类中,就我而言 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)