web-dev-qa-db-ja.com

ツールバーのティントナビゲーションアイコン

メニューアイコンに色を付ける方法は、以下のようにすでに数回説明されています。 Androidのツールバーアイコンの色

このソリューションに加えて、ナビゲーションアイコンの問題がまだあります。ツールバーにテーマ(オーバーレイ)を適用すると、テキストとホワイトリストに登録されたアイコンに色が付きます(参照: https://stackoverflow.com/a/26817918/2417724

カスタムアイコンを設定した場合(デフォルトの戻る矢印を表示したくない場合に変更する必要があるため、これは非常に簡単です)、このカスタムアイコンは色が付きません。

次に、アイコンをどのように処理しますか?私のすべてのアイコンはデフォルトでは黒であり、ツールバーでそれらを使用するためだけに特別な白バージョンを使いたくありません。

13
cwiesner

Appcompatナビゲーションボタン(これは単にAppCompatImageButtonです)は、toolbarNavigationButtonStyle属性を介してスタイル設定できます。 AppCompatテーマのデフォルトスタイルはWidget.AppCompat.Toolbar.Button.Navigationであり、そのスタイルを拡張してtint属性値を追加できます。例えば:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...

    <item name="toolbarNavigationButtonStyle">@style/Toolbar.Button.Navigation.Tinted</item>

</style>

<style name="Toolbar.Button.Navigation.Tinted" parent="Widget.AppCompat.Toolbar.Button.Navigation">
    <item name="tint">@color/nav_button_tint</item>
</style>

この方法を使用する場合は、いくつかの注意点があります。

ライブラリバージョン25.4.0をサポートする前は、AppCompatImageButtonは独自のtint属性を提供していなかったため、アプリの名前空間のtint属性は適用されません(そして、他に定義されていない限り、存在する)。サポートライブラリバージョン25.3.0以前を使用する場合は、プラットフォームAndroid:tint属性を使用する必要があります。

残念ながら、これは別の問題を引き起こします。Lollipop(APIレベル21)より前のプラットフォームの色合いは、単純な単一の色値しか処理できず、ColorStateList<selector>)リソース値を使用すると、スローされるExceptionAndroid:tintの値が単純な色の場合、これは問題になりませんが、ナビゲーションアイコンに別のテーマの色属性(ColorStateListである可能性が高い)と一致するように色付けしたい場合がよくあります。この場合、res/values/res/values-21/に単純な色の値を指定して、Android:tintres/values/に個別のスタイルを作成する必要があります。

たとえば、テーマのメインのテキストの色と一致するように色を付ける場合:

res/values/styles.xml

<item name="Android:tint">@color/normal_text_color</item>

res/values-v21/styles.xml

<item name="Android:tint">?android:textColorPrimary</item>

25.4.0より前のバージョンのサポートライブラリを使用している場合は、上記の注意事項に注意する必要があります。

20
Mike M.