Adv*_*Dog 14 android navigation-drawer android-components android-jetpack android-architecture-navigation
我目前正在使用Android架构组件Navigation,但我遇到了问题Navigation Drawer.它在我的起始目的地显示汉堡包菜单,但其他Fragments显示向上箭头.我相信我的设置navigation_graph不正确.
在这里,您可以看到我的导航抽屉,显示2个项目,主页和设置.在其中任何一个片段中,您应该看到汉堡图标.
但是,在导航到"设置片段"时,它会显示"向上"箭头.
<?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>
Run Code Online (Sandbox Code Playgroud)
我觉得HomeFragment并且SettingsFragment应该以某种方式相关,但我不确定如何定义它.
<?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>
Run Code Online (Sandbox Code Playgroud)
然后在内部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
}
Run Code Online (Sandbox Code Playgroud)
的build.gradle
// Navigation
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha04'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-alpha04'
Run Code Online (Sandbox Code Playgroud)
谢谢.
在较新的alpha(我有1.0.0-alpha07)中,它们增加了topLevelDestinationIds在调用AppBarConfiguration构造函数时进行定义的可能性。
所以我像这样设置我的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)
Run Code Online (Sandbox Code Playgroud)
drMaterialDrawer 在哪里tb,当然还有Toolbar。
然后,它的行为更像Gmail,至少对于而言ActionBarDrawerToggle,后堆栈仍然保留。由于必须由我自己处理MaterialDrawer中的项目选择,因此,我将使用全局导航动作(包括popTo)来减少后退动作,以将其包含到导航图的根片段中,并暂时使用“欢迎屏幕”之类的内容。
另一种解决方法是对的自定义处理onBackPressed。您必须首先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()
}
}
Run Code Online (Sandbox Code Playgroud)
对不起代码,我仍在学习Kotlin,因此可能有更好的方法。
恐怕这是导航组件的一个功能。
当您位于非根目标位置时,操作栏还将显示向上按钮,而位于根目标位置时,操作栏还将显示抽屉图标,并在它们之间自动显示动画。
如果需要,您可以尝试使用setupWithNavController(NavigationView, NavController)并自己处理工具栏。
| 归档时间: |
|
| 查看次数: |
5620 次 |
| 最近记录: |