更改导航抽屉菜单项的颜色

6
这是我的当前导航抽屉的外观:

enter image description here

我已将其分为4组。我的目标是为每个组分配不同的文本颜色。我尝试使用选项SETTINGSFEEDBACKTERMS AND CONDITIONS来设置较小的字体和略微偏黑的颜色。我搜索了一下,但找不到单独自定义导航抽屉组的方法。以下是我编写的菜单代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">


<group
    android:id="@+id/menu"
    android:checkableBehavior="single">

    <item
        android:id="@+id/nav_targets"
        android:icon="@drawable/icon_target"
        android:title="Targets" />

    <item
        android:id="@+id/nav_testing"
        android:icon="@drawable/icon_testing"
        android:title="Testing" />

    <item
        android:id="@+id/nav_course_work"
        android:icon="@drawable/icon_course_work"
        android:title="Course Work" />

    <item
        android:id="@+id/nav_schedule"
        android:icon="@drawable/icon_schedule"
        android:title="Schedule" />

    <item
        android:id="@+id/nav_profile"
        android:icon="@drawable/icon_profile"
        android:title="Profile" />

</group>

<group
    android:id="@+id/settings">
    <item
        android:title="SETTINGS"
        android:id="@+id/settings_item"></item>
</group>

<group
    android:id="@+id/feedback">
    <item
        android:title="FEEDBACK"
        android:id="@+id/feedback_item"></item>
</group>


<group
    android:id="@+id/TnC">
    <item
        android:title="TERMS &#038; CONDITIONS"
        android:id="@+id/t_n_c_item"></item>
</group>

有什么方法可以实现它吗?

检查这个答案会帮助你 https://dev59.com/VlwY5IYBdhLWcg3w7rn6#32114570 - Shabbir Dhangot
2
不行,我已经检查过这个了。它会改变菜单中每个项目的颜色。我想只更改几个项目的颜色 - 而不是全部。 - Akeshwar Jha
@user5038993,你可以试着从strings.xml文件中获取标题,在该文件中定义不同颜色的字符串。希望这能有所帮助。 - Jagjit Singh
@JagjitSingh,我尝试使用HTML设置颜色(请参考https://dev59.com/QWIk5IYBdhLWcg3wDaUW#24392640答案),但我认为这仅适用于TextViews。对我没有起作用。返回了带有HTML标记的整个字符串。 - Akeshwar Jha
没关系,我来帮忙。如果你有问题,请查看我的博客coderzpassion.com。希望你可以从那里得到一些帮助。 - Jagjit Singh
显示剩余2条评论
4个回答

20

有两种方法可以单独自定义导航抽屉菜单项。

第一种方法:

MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_item);
SpannableString s = new SpannableString(menuItem.getTitle());
s.setSpan(new ForegroundColorSpan(TEXT_COLOR), 0, s.length(), 0);
s.setSpan(new AbsoluteSizeSpan(TEXT_SIZE_in_dip, true), 0, s.length(), 0);
menuItem.setTitle(s);

第二种方式:

MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_item);
SpannableString s = new SpannableString(menuItem.getTitle());
s.setSpan(new TextAppearanceSpan(this, R.style.TextAppearance), 0, s.length(), 0);
menuItem.setTitle(s);

res / values / styles.xml

<style name="TextAppearance">
    <item name="android:textColor">TEXT_COLOR</item>
    <item name="android:textSize">TEXT_SIZE_in_sp</item>
</style>

2

如果您想为每个选定的MenuItem使用不同的颜色,可以使用此功能:

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    selectItem(id, item);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

private void selectItem(int id, MenuItem item) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

    switch (id) {
        case R.id.nav_a:
            Fragment newFragment = new FragmentA();
            transaction.replace(R.id.content, newFragment);
            transaction.commit();

            /**
            *Methods to refresh menu (i.e. set all MenuItems to default TextColor) 
            *and to then set TextColor of currently selected MenuItem
            */
            refreshNavMenu();
            setNavMenuItemColor(item, getResources().getColor(R.color.<Your Color>));
            break;
        case R.id.nav_b:
            newFragment = new FragmentB();
            transaction.replace(R.id.content, newFragment);
            transaction.commit();
            refreshNavMenu();
            setNavMenuItemColor(item, Color.BLUE);
            break;
    }
}

private void refreshNavMenu() {
    for (int i = 0; i < navigationView.getMenu().size(); i++) {
        MenuItem item = navigationView.getMenu().getItem(i);
        SpannableString span = new SpannableString(item.getTitle());
        span.setSpan(new ForegroundColorSpan(Color.BLACK), 0, span.length(), 0);
        item.setTitle(span);
    }
}

private void setNavMenuItemColor(MenuItem item, int color) {
    SpannableString span = new SpannableString(item.getTitle());
    span.setSpan(new ForegroundColorSpan(color), 0, span.length(), 0);
    item.setTitle(span);
}

1
这应该可以用于更改导航抽屉中所有菜单项的颜色。
app:itemTextColor="@android:color/holo_orange_light"

这将在父活动的xml文件中定义,其中定义了您的导航抽屉。在这种情况下,使用android.support.v4.widget.DrawerLayout;android.support.design.widget.NavigationView;
<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        app:headerLayout="@layout/nav_header_home"
        app:itemTextColor="@android:color/holo_orange_light"
        app:menu="@menu/activity_home_drawer" />

谢谢,但我想要单独更改菜单项的颜色。就像不同的菜单项有不同的颜色一样。 - Akeshwar Jha

0
 <android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/header"
    android:background="your color"
    app:itemTextColor="your color"
    app:itemIconTint="your color"
    app:menu="@menu/drawer" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接