导航体系结构组件-如何使用导航控制器设置/更改自定义返回或汉堡包图标?

Har*_*rry 3 navigation android android-layout android-architecture-components android-jetpack

我正在尝试实现Jetpack随附的新引入的导航体系结构组件。到目前为止,它对于管理应用程序的导航流程非常酷并且非常有用。

我已经用MainActivity中的工具栏设置了包括抽屉布局在内的基本导航,如下所示:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navController = Navigation.findNavController(this, R.id.mainNavFragment)

        // Set up ActionBar
        setSupportActionBar(toolbar)
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

        // Set up navigation menu
        navigationView.setupWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.mainNavFragment), drawerLayout)
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此布局:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:navigationIcon="@drawable/ic_home_black_24dp"/>

    </android.support.design.widget.AppBarLayout>

    <fragment
        android:id="@+id/mainNavFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_main"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

它的鳍。但是,真正的问题是,何时为应用提供定制设计,

如何设置汉堡包的自定义图标或后退图标?

截至目前,由NavigatoinController本身处理。

在此处输入图片说明

我已经尝试过下面的选项,但是不起作用:

app:navigationIcon="@drawable/ic_home_black_24dp" //1
supportActionBar.setHomeAsUpIndicator(R.drawable.ic_android_black_24dp) //2
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jam*_*ter 7

导航版本存在相同的问题1.0.0-alpha08。我已经通过重新实现setupActionBarWithNavController以提供所需的自定义行为来解决了该问题。

setDisplayShowTitleEnabled(false) //Disable the default title

container.findNavController().addOnDestinationChangedListener { _, destination: NavDestination, _ ->
    //Set the toolbar text (I've placed a TextView within the AppBar, which is being referenced here)
    toolbar_text.text = destination.label

    //Set home icon
    supportActionBar?.apply {
        setDisplayHomeAsUpEnabled((destination.id in NO_HOME_ICON_FRAGMENTS).not())
        setHomeAsUpIndicator(if (destination.id in TOP_LEVEL_FRAGMENTS) R.drawable.app_close_ic else 0)
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要做的就是将一个onDestinationChangedListener添加到导航控制器,并为每个目标设置标题和图标。

该代码应放在包含导航图的活动内的onCreate()方法内,并NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)应从代码中删除。

请注意,这将删除导航抽屉的默认功能。

我希望这有帮助!


小智 7

Navigation Component 使用 DrawerArrowDrawable 作为底层实现,它实际上是在汉堡图标和后退箭头图标之间进行动画处理。两个图标的外观都可以通过样式进行一定程度的修改,参见

如何从 Android appcompat v7 21 库中设置 DrawerArrowToggle 的样式

对于我们的应用程序,我们使用以下属性来获取细长箭头:

    <style name="ToolbarArrow" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="color">@color/primary</item>
        <item name="drawableSize">32dp</item>
        <item name="arrowShaftLength">22dp</item>
        <item name="thickness">1.7dp</item>
        <item name="arrowHeadLength">8dp</item>
    </style>
Run Code Online (Sandbox Code Playgroud)

必须在您的应用主题中设置此样式,如下所示:

    <item name="drawerArrowStyle">@style/ToolbarArrow</item>
Run Code Online (Sandbox Code Playgroud)


小智 2

我使用导航版本时遇到同样的问题1.0.0-alpha07。我找到了以下解决方法:

在我的活动中,我将工具栏视图设置支持操作栏和导航控制器:

val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
toolbar.setupWithNavController(navController, appBarConfiguration)
Run Code Online (Sandbox Code Playgroud)

然后在onViewCreated我想要替换箭头图标的片段中,我设置图标并将其设置为启用(可能可以在 中执行此操作onAttached):

(requireActivity() as AppCompatActivity).supportActionBar?.apply {
  setHomeAsUpIndicator(R.drawable.ic_close_24dp)
  setDisplayHomeAsUpEnabled(true)
}
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,导航组件似乎仍然可以正确处理后退堆栈、动画并删除开始片段上的图标。希望在离开 alpha 之前,导航组件支持自定义图标,而不必求助于旧式操作栏 API。