原文by Norman Peitek 翻譯by Dexter0218
動態著色菜單項
如果你正在開發一個Android應用,你肯定在使用Actionbar里的菜單,像這樣的:

menu items
你應該知道,你可能需要一個XML資源描述你的菜單。為了截圖和下面的例子,你創建了下面的簡單的菜單:
<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里創建菜單,這也是標準Android代碼:
public class MainActivity extends AppCompatActivity {
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
...
}
好吧,上面是添加一個菜單項到你的Actionbar的基礎。在我們的例子里,我們使用一個標準的drawable資源作為圖標。不幸地,只能用紅色。如果你需要其他顏色,你必須把它發給你的設計師,讓她重新設計你需要的顏色。
但是不必啦!這個的tintMenuIcon()方法將actionbar菜單項的圖標,并應用新的顏色:
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);
}
我們讓這個功能變為static的,所以你可以把它移動到你的Utils類里,然后可以從你的app里任意地方調用。我們也會傳遞菜單和我們希望的顏色。當然,你可以傳任意顏色給他,你可以在運行時決定!
缺失的最后一部分是什么時候調用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()
方法。

wished color
當然,你可以用這個技術去讓你的菜單五顏六色:
@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;
}
我們希望這段代碼對你有幫助。我們的設計師再也不用花費時間提供同一圖片的不同顏色的版本,并且我們也不要再慢慢等這些資源了!太棒了??!
如果這段代碼對你有用,你也有類似的快速技巧,在評論里分享出來吧~