Lollipop以前のデバイスでは、サポートライブラリ23.2.0にアップグレードした後、オーバーフローメニューアイコンとアクションバーの戻るボタンが黒色に変わりました。アップグレード前は白(正しい色)です。
オーバーフローメニューアイコンで示されているように、アップグレード後に誤った色が表示されます。
Sytle.xmlのテーマ(pre-v21/Lollipop):
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android" > <!--Used on the application level by the manifest.--> <style name="app_theme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/app_primary_colour</item> <item name="colorPrimaryDark">@color/app_primary_dark_colour</item> <item name="colorAccent">@color/app_accent_colour</item> <item name="Android:windowBackground">@color/app_background</item> <item name="searchViewStyle">@style/custom_search_view_style</item> </style> <!--Used by activities.--> <style name="app_theme.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> <!--TODO: What are these?--> <style name="app_theme.app_bar_overlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="app_theme.popup_overlay" parent="ThemeOverlay.AppCompat.Light" /> ... ... </resources>
here と here を確認しましたが、問題は解決しませんでした。
UPDATE:次のGoogleバグレポートもご覧ください: https://code.google.com/p/Android/issues/detail?id = 201918
直せる。
AppCompatテーマがオーバーフローボタンに次のリソースを使用していることがわかりました:abc_ic_menu_overflow_material.xml
このリソースの内容は次のとおりです。
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:width="24dp"
Android:height="24dp"
Android:viewportWidth="24.0"
Android:viewportHeight="24.0"
Android:tint="?attr/colorControlNormal">
...
</vector>
次に、ドットを接続しました:
修正方法
ライブラリV23.2.0リリースノート( リンクはこちら )によると、ベクターにサポートを追加するには、build.gradleを更新する必要があります。
build.gradle
ビルドグラドルに次の行を追加します
Gradle 2.0(私はテストしませんでした):
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Gradle 1.5(私はこれを使用しています..動作します):
Android {
defaultConfig {
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
テーマを修正する
このステップは無視できます。一部の基本テーマは、colorControlNormal
をすでに白に設定しています(AppCompat.Dark.ActionBar
など)。
ただし、私の場合、すべてのボタンの色が黒のままで、colorControlNormal
をテーマに追加して、白で上書きする必要がありました。
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="colorControlNormal">@color/white</item>
</styel>
これがお役に立てば幸いです。
これは私が私の問題を修正した方法でした。
問題を修正するサポートライブラリ23.2.1にアップデートするだけです。
AppCompatユーザーの場合、23.2ブログの投稿で説明されているサポートベクタードローアブルを有効にするためのフラグ( http://goo.gl/073Mpo )は、AppCompatの使用に必要なくなりました。
https://plus.google.com/+AndroidDevelopers/posts/BZgzpAqkd8G
サポートライブラリを23.2.0に変更すると、この問題が発生しました。戻る矢印とオーバーフローアイコンが黒くなりました。
protected void changeBackArrow() {
final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material);
upArrow.setColorFilter(ContextCompat.getColor(this, R.color.textColorPrimary), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);
}
サポートの時点で、23.1ツールバーにgetOverflowIcon()およびsetOverflowIcon()メソッドが追加されました
protected void changeOverflowMenu() {
final Drawable overflowIcon = getToolbar().getOverflowIcon();
overflowIcon.setColorFilter(ContextCompat.getColor(this, R.color.colorWhite), PorterDuff.Mode.SRC_ATOP);
getToolbar().setOverflowIcon(overflowIcon);
}
受け入れられた回答が正しくなかったため、この回答を書いています(正しいのですが)。しかし、私はそれを別の方法で解決したので、ここでそれを共有しています:
まず、gradleファイルには何も追加しませんでした。サポートライブラリv23.4.0を使用しています。これは、この記事の執筆時点で最新のものであるためです。
私にとってうまくいったのはカラーリソース参照を使用する代わりに、ティントカラーまたはパスカラーをハードコーディングするです。たとえば、Android:fillColor="#fff"
の代わりにAndroid:fillColor="@Android:color/white"
を使用します。
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:width="24dp"
Android:height="24dp"
Android:tint="#fff"
Android:viewportHeight="24"
Android:viewportWidth="24">
<path
Android:fillColor="#fff"
Android:pathData="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" />
</vector>
上記のコードスニペットの色合いとパスの色を確認します。以前は色を"@color/someColor"
として割り当てていましたが、v21以降でのみ機能することを警告し、v21以下では実際には機能しませんでした。そこで、それをハードコードされた値に変更しました。繰り返しますが、これは単純な回避策/ハックであり、おそらく正しい解決策ではありません。
アクティビティのonCreate()の開始時に呼び出すことができるヘルパー関数(私は便利な関数を持つ静的ヘルパークラスを使用)を作成しました。
public static void setWhiteBackArrow(ActionBar actionbar, Context context){
//needed due to bug in Android compile version 23
// https://code.google.com/p/Android/issues/detail?id=201918
if (actionbar != null) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
final Drawable upArrow = ContextCompat.getDrawable(context, Android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
//ActionBar aBar = context.getSupportActionBar();
actionbar.setHomeAsUpIndicator(upArrow);
}
}
アクティビティのonCreate()で次のように呼び出します。
Helper.setWhiteBackArrow(getSupportActionBar(), this);