1. ホーム
  2. android

[解決済み] AppCompat ToolbarのMenuItemの色合いについて

2022-11-29 19:56:49

質問

のdrawableを使用する場合 AppCompat ライブラリから Toolbar を使用すると、色合いが期待通りに動作します。このように

<item
    android:id="@+id/action_clear"
    android:icon="@drawable/abc_ic_clear_mtrl_alpha"  <-- from AppCompat
    android:title="@string/clear" />

しかし、もし私が自分のdrawableを使ったり、実際にdrawableを AppCompat ライブラリから自分のプロジェクトにコピーしても、全く色合いが変わりません。

<item
    android:id="@+id/action_clear"
    android:icon="@drawable/abc_ic_clear_mtrl_alpha_copy"  <-- copy from AppCompat
    android:title="@string/clear" />

には何か特別な魔法があるのでしょうか? AppCompat Toolbar で、そのライブラリからの drawable のみを着色するような特別な魔法があるのでしょうか?私自身のdrawableでこれを動作させる方法はありますか?

API Level 19 のデバイスでこれを実行すると compileSdkVersion = 21targetSdkVersion = 21 のすべてを使用し、さらに AppCompat

abc_ic_clear_mtrl_alpha_copy は正確なコピーであり abc_ic_clear_mtrl_alpha からのpng AppCompat

編集します。

色合いは、私が設定した値に基づいて android:textColorPrimary に設定した値に基づいています。

<item name="android:textColorPrimary">#00FF00</item> とすると、緑がかった色になります。

スクリーンショット

AppCompat の drawable で色合いが期待通りに動作している。

AppCompat からコピーした drawable でティントが機能しない

どのように解決するのですか?

なぜなら、AppCompatでTintManagerのソースコードを見てみると、わかります。

/**
 * Drawables which should be tinted with the value of {@code R.attr.colorControlNormal},
 * using the default mode.
 */
private static final int[] TINT_COLOR_CONTROL_NORMAL = {
        R.drawable.abc_ic_ab_back_mtrl_am_alpha,
        R.drawable.abc_ic_go_search_api_mtrl_alpha,
        R.drawable.abc_ic_search_api_mtrl_alpha,
        R.drawable.abc_ic_commit_search_api_mtrl_alpha,
        R.drawable.abc_ic_clear_mtrl_alpha,
        R.drawable.abc_ic_menu_share_mtrl_alpha,
        R.drawable.abc_ic_menu_copy_mtrl_am_alpha,
        R.drawable.abc_ic_menu_cut_mtrl_alpha,
        R.drawable.abc_ic_menu_selectall_mtrl_alpha,
        R.drawable.abc_ic_menu_paste_mtrl_am_alpha,
        R.drawable.abc_ic_menu_moreoverflow_mtrl_alpha,
        R.drawable.abc_ic_voice_search_api_mtrl_alpha,
        R.drawable.abc_textfield_search_default_mtrl_alpha,
        R.drawable.abc_textfield_default_mtrl_alpha
};

/**
 * Drawables which should be tinted with the value of {@code R.attr.colorControlActivated},
 * using the default mode.
 */
private static final int[] TINT_COLOR_CONTROL_ACTIVATED = {
        R.drawable.abc_textfield_activated_mtrl_alpha,
        R.drawable.abc_textfield_search_activated_mtrl_alpha,
        R.drawable.abc_cab_background_top_mtrl_alpha
};

/**
 * Drawables which should be tinted with the value of {@code android.R.attr.colorBackground},
 * using the {@link android.graphics.PorterDuff.Mode#MULTIPLY} mode.
 */
private static final int[] TINT_COLOR_BACKGROUND_MULTIPLY = {
        R.drawable.abc_popup_background_mtrl_mult,
        R.drawable.abc_cab_background_internal_bg,
        R.drawable.abc_menu_hardkey_panel_mtrl_mult
};

/**
 * Drawables which should be tinted using a state list containing values of
 * {@code R.attr.colorControlNormal} and {@code R.attr.colorControlActivated}
 */
private static final int[] TINT_COLOR_CONTROL_STATE_LIST = {
        R.drawable.abc_edit_text_material,
        R.drawable.abc_tab_indicator_material,
        R.drawable.abc_textfield_search_material,
        R.drawable.abc_spinner_mtrl_am_alpha,
        R.drawable.abc_btn_check_material,
        R.drawable.abc_btn_radio_material
};

/**
 * Drawables which contain other drawables which should be tinted. The child drawable IDs
 * should be defined in one of the arrays above.
 */
private static final int[] CONTAINERS_WITH_TINT_CHILDREN = {
        R.drawable.abc_cab_background_top_material
};

つまり、特定の resourceIds をホワイトリストに登録し、色付けしていることを意味します。

しかし、彼らがどのように画像を着色しているかを見て、同じことをすることはいつでもできると思います。drawable に ColorFilter を設定するのと同じくらい簡単です。