如何在导航抽屉中指定用于项目的图标?

时间:2020-06-27 09:26:34

标签: android

基于此Developer Guide,我将导航抽屉添加到了我的应用中。打开导航看起来像这样。

screenshot

我想在左侧使用图标的灰色方块是什么?

我的导航图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"
    android:id="@+id/nav_graph"
    app:startDestination="@id/commandFragment">

    <fragment
        android:id="@+id/completedCommandsFragment"
        android:name="io.dailyunix.CompletedCommandsFragment"
        android:label="Completed commands"
        android:icon="@+id/ic_menu_info_details"
        tools:layout="@layout/fragment_list" >
    </fragment>

    <fragment
        android:id="@+id/remainingCommandsFragment"
        android:name="io.dailyunix.RemainingCommandsFragment"
        android:label="Remaining commands"
        tools:layout="@layout/fragment_list" >
    </fragment>

    <fragment
        android:id="@+id/commandFragment"
        android:name="io.dailyunix.CommandFragment"
        android:label="Command"
        tools:layout="@layout/fragment_command" >
        <argument
            android:name="command"
            app:argType="string" />
    </fragment>

    <action
        android:id="@+id/action_global_commandFragment"
        app:destination="@id/commandFragment" />
  </navigation>

添加此属性似乎无济于事:

    android:icon="@+id/ic_menu_info_details"

我不必在导航中为项目添加任何布局,所以我不知道它在做什么。我也没有在导航代码实验室中提到如何执行此操作。

[编辑]

DevMike01指出,我应使用@drawable/而不是@+id/来引用图标(duh)。但是解决此问题似乎不足以解决问题。这是布局检查器的屏幕截图。

layout inspector

[编辑2]

类似的事情可以在“活动”中以编程方式完成:

override fun onCreate(savedInstanceState: Bundle?) {
  ...
  navigation.menu.getItem(0).icon = getDrawable(R.drawable.ic_completed)
  navigation.menu.getItem(1).icon = getDrawable(R.drawable.ic_remaining)
  ...
}

但这是远距离和脆弱的动作。我宁愿在XML中执行此操作。

3 个答案:

答案 0 :(得分:2)

将图标保存在drawable文件夹中,并假定该图标的名称为@drawable/ic_menu_info_details,更改对此ic_menu_info_details的引用方式。 @+id/...用于为视图分配ID。

答案 1 :(得分:0)

您可以通过在菜单XML文件中添加android:icon属性来设置抽屉图标。

示例:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/primary">
        <item
            android:id="@id/home_dest"
            android:icon="@drawable/ic_home"
            android:title="@string/home" />
        <item
            android:id="@id/deeplink_dest"
            android:icon="@drawable/ic_android"
            android:title="@string/deeplink" />
    </group>

    <item
        android:id="@+id/settings_dest"
        android:icon="@drawable/ic_settings"
        android:title="@string/settings" />

</menu>

在这里,您的res / drawable需求必须具有可以从android资源中获取的最上面引用的图标(ic_android,ic_settings,home_dest)

( res > RClick > New > Image Assets / Vector Assets)

答案 2 :(得分:0)

事实证明,我确实确实遗忘了另一个文件menu/nav.xml

<item android:id="@+id/completedCommandsFragment"
    android:icon="@drawable/ic_completed"
    android:title="@string/completed"
    app:showAsAction="ifRoom" />
<item android:id="@+id/remainingCommandsFragment"
    android:icon="@drawable/ic_remaining"
    android:title="@string/remaining"
    app:showAsAction="ifRoom" />

我认为我的菜单项是由导航组件根据我的navigation/nav_graph.xml文件动态生成的,但事实并非如此。我需要使这两个文件保持同步,并使用menu/nav.xml作为图标。看来menu/nav.xml中项目标签上的ID必须与navigation/nav_graph.xml中片段标签上的ID匹配。