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

原文by Norman Peitek 翻譯by Dexter0218

動(dòng)態(tài)著色菜單項(xiàng)

如果你正在開發(fā)一個(gè)Android應(yīng)用,你肯定在使用Actionbar里的菜單,像這樣的:

menu items
menu items

你應(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()方法。

wished color
wished color

當(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í)間提供同一圖片的不同顏色的版本,并且我們也不要再慢慢等這些資源了!太棒了!!

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容