Android Quick Tips #8 — How to Dynamically Tint Actionbar Menu Icons

原文by Norman Peitek 翻譯by Dexter0218

動態著色菜單項

如果你正在開發一個Android應用,你肯定在使用Actionbar里的菜單,像這樣的:

menu items
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
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;
}

我們希望這段代碼對你有幫助。我們的設計師再也不用花費時間提供同一圖片的不同顏色的版本,并且我們也不要再慢慢等這些資源了!太棒了??!

如果這段代碼對你有用,你也有類似的快速技巧,在評論里分享出來吧~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容