原文by Norman Peitek 翻譯by Dexter0218
動(dòng)態(tài)著色菜單項(xiàng)
如果你正在開發(fā)一個(gè)Android應(yīng)用,你肯定在使用Actionbar里的菜單,像這樣的:

你應(yīng)該知道,你可能需要一個(gè)XML資源描述你的菜單。為了截圖和下面的例子,你創(chuàng)建了下面的簡單的菜單:
<menu 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"
tools:context=".MainActivity">
<item
android:id="@+id/action_delete"
android:icon="@android:drawable/ic_delete"
android:title="Delete"
app:showAsAction="ifRoom"/>
</menu>
接著,我們需要在Activity里創(chuàng)建菜單,這也是標(biāo)準(zhǔn)Android代碼:
public class MainActivity extends AppCompatActivity {
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
...
}
好吧,上面是添加一個(gè)菜單項(xiàng)到你的Actionbar的基礎(chǔ)。在我們的例子里,我們使用一個(gè)標(biāo)準(zhǔn)的drawable資源作為圖標(biāo)。不幸地,只能用紅色。如果你需要其他顏色,你必須把它發(fā)給你的設(shè)計(jì)師,讓她重新設(shè)計(jì)你需要的顏色。
但是不必啦!這個(gè)的tintMenuIcon()方法將actionbar菜單項(xiàng)的圖標(biāo),并應(yīng)用新的顏色:
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);
}
我們讓這個(gè)功能變?yōu)閟tatic的,所以你可以把它移動(dòng)到你的Utils類里,然后可以從你的app里任意地方調(diào)用。我們也會傳遞菜單和我們希望的顏色。當(dāng)然,你可以傳任意顏色給他,你可以在運(yùn)行時(shí)決定!
缺失的最后一部分是什么時(shí)候調(diào)用tintMenuIcon()方法。我們推薦在onCreateOptionsMenu()方法里做:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
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);
}
return true;
}
menu.findItem()會獲取你需要的特定的菜單,然后,如果Android找到了它,它會將與期望的顏色一并傳遞給我們的tintMenuIcon()方法。

當(dāng)然,你可以用這個(gè)技術(shù)去讓你的菜單五顏六色:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem menuItemDelete = menu.findItem(R.id.action_delete);
MenuItem menuItemAdd = menu.findItem(R.id.action_add);
if (menuItemDelete != null) {
tintMenuIcon(MainActivity.this, menuItemDelete, android.R.color.holo_purple);
}
if (menuItemAdd != null) {
tintMenuIcon(MainActivity.this, menuItemAdd, android.R.color.holo_green_dark);
}
return true;
}
我們希望這段代碼對你有幫助。我們的設(shè)計(jì)師再也不用花費(fèi)時(shí)間提供同一圖片的不同顏色的版本,并且我們也不要再慢慢等這些資源了!太棒了!!
如果這段代碼對你有用,你也有類似的快速技巧,在評論里分享出來吧~