【问题标题】:Changing colors of Navigation Drawer menu items更改导航抽屉菜单项的颜色
【发布时间】:2016-06-16 08:03:19
【问题描述】:

这是我当前的导航抽屉的样子:

我已将其分为 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>

有办法实现吗?

【问题讨论】:

  • 检查这个答案会帮助你stackoverflow.com/a/32114570/2900893
  • 不,已经检查了这个。它会改变菜单中每个项目的颜色。我正在尝试仅对少数项目进行更改 - 不是全部。
  • @user5038993 尝试从 strings.xml 中获取标题,并在 strings.xml 中定义具有不同颜色的字符串。希望对你有帮助
  • @JagjitSingh,我尝试使用 html 来设置颜色(请参阅stackoverflow.com/a/24392640/5038993 答案),但我认为这仅适用于 TextViews。它对我不起作用。返回带有 html 标签的整个字符串。
  • @user5038993 请发布完整代码

标签: android navigation-drawer


【解决方案1】:

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

第一种方式:

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

    【讨论】:

      【解决方案3】:

      这应该适用于更改导航抽屉中的所有菜单项颜色。

      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" />
      

      【讨论】:

      • 谢谢,但我正在尝试单独更改菜单项颜色。就像不同的菜单项有不同的颜色。
      【解决方案4】:
       <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" />
      

      【讨论】:

        猜你喜欢
        • 2015-09-02
        • 2015-11-09
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 2015-10-23
        相关资源
        最近更新 更多