2014-06-19 3 views
16

저는 Android 앱을 제작 중이며 작업 표시 줄 아이콘 팩의 아이콘을 사용하여 작업 표시 줄에서 사용하고 있습니다. 나는 menu 폴더의 xml 파일을 통해 그것들을 정의한다. 아이콘이 모두 같은 색이되도록이 아이콘을 "틴트 (tint)"하는 방법이 있습니까? 지금까지 이미지 편집 소프트웨어를 사용하여 수동으로 작업해야했지만 컬러를 변경하기로 결정했다면 다시해야합니다.색조 메뉴 아이콘

나는 ImageView에 대해 android:tint 속성을 알고 있지만 메뉴 아이콘으로 사용할 방법을 찾지 못했습니다.

감사

+0

https://futurestud.io/tutorials/android-quick-tips-8-how-to-dynamically-tint-actionbar-menu-icons 그것이 가능한 것 'iconTint' 속성을 사용하고 해당 drawable에 setColorFilter를 프로그래밍 방식으로 적용합니까? –

답변

41

이 작업을 할 수있는 더 좋은 방법이있을 수 있지만, 하나의 옵션은 코드에서 아이콘을 다시 그려야하는 것입니다.

MenuItem favoriteItem = menu.findItem(R.id.action_favorite); 
Drawable newIcon = (Drawable)favoriteItem.getIcon(); 
newIcon.mutate().setColorFilter(Color.argb(255, 200, 200, 200), PorterDuff.Mode.SRC_IN); 
favoriteItem.setIcon(newIcon); 

또한 이제 DrawableCompat에서 색조를 사용하는 대신 수

newIcon.mutate().setColorFilter(getResources().getColor(R.color.myCustomTint), PorterDuff.Mode.SRC_IN); 
+0

위대한 답변, 감사합니다! –

6

같은 색상 자원을 사용할 수 있습니다

당신이 즐겨 찾기에 대한 메뉴 항목이하고 회색 색조한다고 가정 컬러 필터 :

MenuItem favoriteItem = menu.findItem(R.id.action_favorite); 
Drawable favoriteIcon = DrawableCompat.wrap(favoriteItem.getIcon()); 
ColorStateList colorSelector = ResourcesCompat.getColorStateList(getResources(), R.color.tinted_selector, getTheme()); 
DrawableCompat.setTintList(favoriteIcon, colorSelector); 
favoriteItem.setIcon(favoriteIcon); 
12

원본 소스가 래스터 이미지 인 경우 그것을 <bitmap>으로 감쌀 수 있습니다.

<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/ic_action_settings" 
    android:tint="@color/colorRed"/> 

다음 메뉴 항목이 그릴 수 사용 : 당신이 유틸 클래스의 정적 메서드를 만들 수 있습니다 개선하기 위해

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item android:id="@+id/new_game" 
    android:icon="@drawable/settings_icon" 
    android:title="@string/settings" 
    app:showAsAction="always"/> 
</menu> 
+0

현명한 해결책. –

+0

정적 메뉴 항목을위한 깨끗한 솔루션입니다. – box

0

을 settings_icon.xml -

것은 당김 폴더에이 파일을 추가 당신이 원할 때마다 그 방법을 사용하십시오.

-------- 메서드 정의 -----------------------------------

public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) { 
    Drawable normalDrawable = item.getIcon(); 
    Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable); 
    DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color)); 

    item.setIcon(wrapDrawable); 
} 

--------------------- 사용 방법 ------------------- ------------

Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    MenuItem menuItem = menu.findItem(R.id.action_delete); 

    if (menuItem != null) { 
     tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE 
    } 

    return true; 
} 

내 소스이었다 예는`item` XML 태그, 예를 들어에 대한 속성을 작성하는