gpt4 book ai didi

Android 导航架构组件 - 抽屉导航图标

转载 作者:可可西里 更新时间:2023-11-01 19:06:09 27 4
gpt4 key购买 nike

我目前正在使用 Android 架构组件的 Navigation,但我的 Navigation Drawer 遇到了问题。它在我的起始目的地时显示汉堡包菜单,但其他 Fragments 显示向上箭头。我相信我的 navigation_graph 设置不正确。

在这里你可以看到我的抽屉导航,显示 2 个项目,主页和设置。在这些 fragment 中的任何一个中,您都应该看到汉堡包图标。

nav drawer

但是,当导航到设置 fragment 时,它会显示向上箭头。

toolbar

导航.graph.xml

<?xml version="1.0" encoding="utf-8"?>
<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/nav_home">

<!-- Start at HomeFragment -->
<fragment
android:id="@+id/nav_home"
android:name=".HomeFragment"
android:label="@string/home">

<!-- Navigate to the Search -->
<action
android:id="@+id/action_nav_home_to_nav_search"
app:destination="@id/nav_search" />
</fragment>


<fragment
android:id="@+id/nav_settings"
android:name=".SettingsFragment"
android:label="@string/settings">

<!-- Navigate to the Search -->
<action
android:id="@+id/action_nav_settings_to_nav_search"
app:destination="@id/nav_search" />
</fragment>



<fragment
android:id="@+id/nav_search"
android:name=".SearchFragment"
android:label="@string/search" />

</navigation>

我觉得 HomeFragmentSettingsFragment 应该以某种方式相关,但我不确定如何定义它。

main_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@id/nav_home"
android:icon="@drawable/ic_home_white_24dp"
android:title="@string/home" />

<item
android:id="@id/nav_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="@string/settings" />
</group>
</menu>

主要 Activity

然后在 MainActivity 中,我只是像这样设置它。我调用了 setupActionBarWithNavController,但我还必须自己实际设置抽屉导航,并处理 onNavigationItemSelected

private fun setupNavigation() {
navController = findNavController(R.id.mainNavigationFragment)
setupActionBarWithNavController(this, navController, drawer_layout)

val toggle = ActionBarDrawerToggle(
this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer_layout.addDrawerListener(toggle)
toggle.syncState()

nav_view.setNavigationItemSelectedListener(this)
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
val current = navController.currentDestination.id
if (item.itemId != current) {
navController.navigate(item.itemId)
}

drawer_layout.closeDrawers()
return true
}

构建.gradle

// Navigation
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha04'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-alpha04'

谢谢。

最佳答案

在较新的 alpha 中(我有 1.0.0-alpha07),他们增加了在调用 AppBarConfiguration 构造函数时定义 topLevelDestinationIds 的可能性。

所以我这样设置我的 NavController

    val navController = findNavController(R.id.nav_host_fragment)
val config = AppBarConfiguration(
setOf(
R.id.fistTopFragment,
R.id.secondTopFragment,
...
),
dr.drawerLayout
)
tb.setupWithNavController(navController, config)

dr 是 MaterialDrawer,tb 当然是 Toolbar。

然后它的行为更像 Gmail,至少对于 ActionBarDrawerToggle,返回堆栈仍然保留。由于我必须自己处理 MaterialDrawer 中的项目选择,因此我将使用包含 popTo 的全局导航操作减少返回堆栈操作到导航图的根 fragment ,并暂时使用类似“欢迎屏幕”的东西。

另一种方法是自定义处理 onBackPressed。您必须首先从 Activity 布局中的主机 fragment 中删除 app:defaultNavHost="true"。像这样

override fun onBackPressed() {
val navController = findNavController(R.id.nav_host_fragment)
if (navController.currentDestination == null
|| navController.currentDestination!!.id in setOf(
R.id.fistTopFragment,
R.id.secondTopFragment,
...
)
) {
super.onBackPressed()
} else {
navController.navigateUp()
}
}

关于代码,我很抱歉,我还在学习 Kotlin,所以可能有更好的方法来做到这一点。

关于Android 导航架构组件 - 抽屉导航图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51528870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com