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

Adv*_*Dog 14 android navigation-drawer android-components android-jetpack android-architecture-navigation

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

在这里,您可以看到我的导航抽屉,显示2个项目,主页和设置.在其中任何一个片段中,您应该看到汉堡图标.

导航抽屉

但是,在导航到"设置片段"时,它会显示"向上"箭头.

工具栏

navigation.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>
Run Code Online (Sandbox Code Playgroud)

我觉得HomeFragment并且SettingsFragment应该以某种方式相关,但我不确定如何定义它.

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>
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)

谢谢.

Alm*_*hty 7

在较新的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,因此可能有更好的方法。


fer*_*ini 4

恐怕这是导航组件的一个功能

当您位于非根目标位置时,操作栏还将显示向上按钮,而位于根目标位置时,操作栏还将显示抽屉图标,并在它们之间自动显示动画。

如果需要,您可以尝试使用setupWithNavController(NavigationView, NavController)并自己处理工具栏。