导航抽屉项目图标未显示原始颜色


138

我正在尝试为导航抽屉的菜单中的项目旁边显示一个图标,但是由于某种原因,该图标始终显示为灰色,而不是原始颜色(棕色)。有什么方法可以防止这种情况发生,以显示图标的原始颜色?

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        if (navigationView != null) {
            setupDrawerContent(navigationView);
        }
    }

    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mDrawerLayout.closeDrawers();

                return true;
            }
        });
    }
}

cabinet_view.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="Section">
        <menu>
            <item
                android:id="@+id/navigation_item_1"
                android:icon="@drawable/ic_browncircle"
                android:title="Sub item 1" />
        </menu>
    </item>
</menu>

在此处输入图片说明


你有什么ic_browncircle

@YeLinAung一个棕色的圆圈,类似于“子项目1”旁边的上面的图标,但颜色为棕色,而不是灰色。
MacaronLover 2015年

也许您可以尝试.setColorFilter(MY_BROWN_COLOR)这种观点?
叶林昂2015年

请在下面查看我的答案。
Ye Lin Aung 2015年

Answers:


350

我在这里找到了答案:https : //stackoverflow.com/a/30632980/875249

为了避免链接,它非常简单:

    mNavigationView.setItemIconTintList(null);

这将禁用所有基于状态的着色,但是您也可以指定自己的列表。对我来说很棒!

在这里您可以获取有关创建颜色状态列表的详细信息,但它也非常简单:http : //developer.android.com/reference/android/content/res/ColorStateList.html

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true" android:color="@color/primary" />
        <item android:state_checked="false" android:color="@android:color/white" />
    </selector>

是的,我在运行API 17的Nexus 4上进行了测试。我也在Android M预览版上进行了测试。ColorStateList已经存在了一段时间,并且NavigationView是支持库的一部分,所以我看不出为什么这种方法不能一直适用于ICS甚至可能更远。
克里斯(Chris)

11
有XML替代方法吗?尝试过app:itemIconTint="@null"但没有成功。
Mangesh '16

谢谢,我开始对此问题
感到

4
mNavigationView.setItemIconTintList(null);这就是我一直在寻找的答案……
Jahid

1
您在哪里使用选择器?
John Sardinha

49

    mNavigationView.setItemIconTintList(null);

这是正确的。另外,如果您所有的图标都采用一种配色方案(我全为白色),则可以通过xml文件设置-app:itemIconTint =“ @ android:color / white”

我的情况:

<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:clickable="true"
    app:headerLayout="@layout/nav_header_main"
    app:itemTextColor="@android:color/white"
    app:menu="@menu/activity_main_drawer"
    android:background="@android:color/black"
    app:itemIconTint="@android:color/white"
    />

您知道如何解决其他问题吗?
MacaronLover

这很好用,mNavigationView.setItemIconTintList(null);从所有图标中删除默认的iconTint。现在,如果您的图标为红色,它将显示为红色,不会应用iconTint。
Syed Hissaan

5

我在我的一个应用程序中尝试过类似的操作。是的,看起来图标颜色没有改变。但是我设法解决了另一种方法。这是我的ic_browncircle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:tint="@color/brown"
    >
  <size
      android:height="3dp"
      android:width="3dp"
      />
  <solid android:color="@color/brown"/>
</shape>

我相信这与您相似,但是没有任何效果,也不会改变颜色。

所以我所做的就是这个。

navigationView.getMenu()
    .findItem(R.id. navigation_item_1)
    .getIcon()
    .setColorFilter(Color.parseColor("#b69260"), PorterDuff.Mode.SRC_ATOP);

而且似乎可行。这是结果。

在此处输入图片说明


棒棒糖之前怎么样?
MacaronLover

我一直在尝试棒棒糖之前的几种解决方案。到目前为止,还没有运气:(

4

如果使用提供的导航抽屉创建项目Android Studio。在您的Main Activity类中,您只需将这一行代码添加navigationView.setItemIconTintList(null);到您的onCreate方法中即可。像这样;

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
 navigationView.setNavigationItemSelectedListener(this);
 navigationView.setItemIconTintList(null); // <----- HERE
 setupDrawerContent(navigationView);

3

您可以尝试使用着色的可绘制对象,不确定它是否低于5.0。

创建一个可绘制对象并添加以下代码。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_browncircle"
    android:tint="@color/brownColor"/>

然后将可绘制的菜单项更改为刚创建的菜单项。如果那行不通,那么我不确定是否有其他解决方案。您可以尝试以下库:https : //github.com/mikepenz/MaterialDrawer我在项目中经常使用它。


此方法不适用于API 17(4.2)。原因(至少以我的经验),是当您将主题设置为浅色时,导航抽屉会自动在白色图标上覆盖黑色。当我从主题中删除灯光时,我的图标将恢复为白色,就像我期望的那样。
克里斯


1

此代码有些不起作用 MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

所以你可以使用它。

MainActivity.java

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
   navigationView.setNavigationItemSelectedListener(this); 
   navigationView.setItemIconTintList(null); // <-- HERE add this code for icon color

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.