LollipopのbackgroundTintはボタンには影響しません


83

アクティビティにボタンがあり、テーマのアクセントカラーを付けたいのですが。ロリポップ以前のように自分でドローアブルを作成する代わりに、当然、新しいbackgroundTint属性を使用したいと思います。

<Button
    android:id="@+id/btnAddCode"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/accent"
    android:text="@string/addressInfo_edit_addCode" />

残念ながら効果はなく、ボタンは灰色のままです。

さまざまな値を試しました backgroundTintMode変えてみましたが、何も変わりませんでした。

また、アクティビティでプログラムで試してみましたが、何も変わりませんでした。

addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
     getResources().getColorStateList(R.color.accent));

なぜ私の色合いが無視されるのですか?

編集:明確にするために、私は確かにロリポップデバイスでテストしています。他のウィジェット(EditTextなど)は正しく自動的に色付けされます。


3
これは将来のリリースで修正されたバグですが、受け入れられたソリューションはAPI21以降で機能します。
alanv 2015年

回答:


18

API19からAPI27でテスト済み

<?xml version="1.0" encoding="utf-8"?>
  <android.support.v7.widget.AppCompatButton 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/retry"
    android:textColor="@android:color/white"
    app:backgroundTint="@android:color/holo_red_dark" />

次のように出力を生成します-

ここに画像の説明を入力してください


数年後、現在、これを行うための公式の(そして最良の)方法であると私は信じているので、これを受け入れられた答えとしてマークします。(詳細:ほとんどの場合、AppCompatButtonの代わりにButtonを使用でき、それでも機能すると確信しています)。
BoD 2018

118

悪いニュース

BoDが言うように、Lollipop 5.0(APIレベル21)でボタンの背景に色を付けることは無意味です。

良いニュース

Lollipop 5.1(APIレベル22)は、btn_mtrl_default_shape.xml(他のファイルの中でも)を変更することでこれを修正したようです。 https

素晴らしいニュース

新しいサポートライブラリ(バージョン22.1以降)AppCompatButtonを含む多くのコンポーネントに下位互換性のある色付けサポート追加します!

残念ながら、android:backgroundTintプロパティはまだ機能しません(おそらく私は何か間違ったことをしています)-したがってColorStateList、を使用してコードで設定する必要がありますsetSupportBackgroundTintList()android:backgroundTint将来的にサポートされるのを見るのは本当に素晴らしいことです。更新:Marcio Granzottoは、app:backgroundTintAppCompatButtonで機能するとコメントしました!アプリ/ライブラリにあるためapp:、ではなくandroid:、であることに注意してください。

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <AppCompatButton
        android:id="@+id/mybutton"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:text="Testing, testing"
        app:backgroundTint="#ff00ff"/>

</LinearLayout>

から継承させると、アクティビティはAppCompatButton通常ではなく自動的に膨らみButtonますAppCompatActivity

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton);
        ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
        v.setSupportBackgroundTintList(csl);
    }
}

もちろんColorStateList、カラーリソースから取得する必要がありますが、私は怠惰だったので...

ああ、そしてテーマの1つに基づいてアプリのテーマを作成することを忘れないでください。そうしないとTheme.AppCompat、互換性のあるビューが非常に悲しくなります...;)

これは、2.3.7(Gingerbread MR1)と5.0(Lollipop'Classic ')の両方で機能しました。


1
さらに情報を追加しました。最も重要なのは、先日リリースされたサポートライブラリの新しいバージョン(22.1)でボタンの色付けを実現できるようになったことです。
Snild Dolkow 2015

8
colorButtonNormalAppCompat 22.1.1(ボタンにのみテーマを設定)で使用できます。4.4.4および5.1で機能します。
hunyadym 2015

2
TextViewに同じものを設定する方法はありますか?
Androidデベロッパー

8
代わりに、new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});より簡潔に書くことができますColorStateList.valueOf(0xffffcc00);
Ashkan Sarlak 2015年

5
android.support.v7.widget.AppCompatButtonをxmlのapp:backgroundTintで使用できます
Marcio Granzotto 2016年

30

リップルドローアブルに色を付けることは無意味のようです(ボタンのデフォルトの背景はリップルドローアブルです)。

実際、プラットフォームのデフォルトのボタンドローアブルを調べた後、これを行うための「正しい」方法を見つけました。テーマでこれを定義する必要があります。

    <item name="android:colorButtonNormal">@color/accent</item>

(もちろん、これはレベル21以上の場合のみです。)

警告:これはテーマで定義されているため、すべてのボタンに指定された色が使用されます(少なくともそのテーマを使用するアクティビティのすべてのボタン)。

ボーナスとして、これを定義することで波紋の色を変更することもできます。

    <item name="android:colorControlHighlight">@color/accent_ripple</item>

colorControlHighlightただし、他の多くのウィジェットを変更します。うまくいったことをうれしく思います。
natario 2015年

5
オーバーレイテーマを定義し(たとえば、親テーマがなく、属性が1つだけ定義されている)、android:theme属性を使用することで、これを個々のビューに適用できます。
alanv 2015年

1
では、API 22以降ではどのように修正されますか?また、この「バグ」はAPI 21の一部のデバイス(ネクサス5、ギャラクシーs3を含む)でのみ発生します
vedant 2015年

22

Android 5.0.xでの色付けに関連する問題を解決するには、次のようなものを使用します。

public static void setButtonTint(Button button, ColorStateList tint) {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && button instanceof AppCompatButton) {
        ((AppCompatButton) button).setSupportBackgroundTintList(tint);
    } else {
        ViewCompat.setBackgroundTintList(button, tint);
    }
}

API 21にのみサポートメソッドを使用し、その他すべての場合にはViewCompatメソッドを使用します。


@Marco使用:if (view instanceof TintableBackgroundView) { ((TintableBackgroundView) view).setSupportBackgroundTintList(tint); } else { ViewCompat.setBackgroundTintList(view, tint); }
chessdork 2016

これは、ロリポップ以前のデバイスのImageButtonでは機能しません。
toobsco42 2017年

AppCompatButton.setSupportBackgroundTintList()を使用すると、糸くずの出ない警告が表示されます。AppCompatButton.setSupportBackgroundTintListは、同じライブラリグループ(groupId = com.android.support)内からのみ呼び出すことができます
starkej2 2017

それは私にとってはうまくいきましたが、私は条件を逆転させなければなりませんでした。
RodrigoVenancio18年

「同じライブラリグループ(groupId = com.android.support」内からのみ呼び出すことができます」なぜこの警告が表示されるのですか?
Ferran Negre

22

私は通常、PorterDuffを使用して動的に実行します。

mbutton = (Button) findViewById(R.id.mybutton);
mbutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY);

ここでさまざまなブレンドモードを確認でき、ここで良い例を確認できます


1
私はPorterDuff.Mode.SRCを使用しましたが、完全に機能します
francisco_ssb

完璧に動作します。私の場合、API 17で色付け効果を使用したかったので、これは役に立ちました。
ashishdhiman2007 2017年

2
これは受け入れられた答えでなければなりません。API 20に取り組んで確認
ハルダンゲル


9

私はあなたが仕事android:backgroundをするために設定する必要があると思いますandroid:backgroundTint

より正確に言うと、backgroundTintマテリアルテーマのデフォルトのボタンの背景は、として定義されているとは言えないと思いますRippleDrawable


1
あなたは正しいと思います。実際、私は自分がやりたいことをするための「正しい」方法を見つけました(私の答えを参照してください)。
BoD 2015年

3

同様の問題がグーグルhttps://code.google.com/p/android/issues/detail?id=201873で報告されました

ただし、Androidサポートライブラリのリリース後、リビジョン23.2.1 (2016年3月)このバグは解決されています。

問題:FloatingActionButton.setBackgroundTintList(@Nullable ColorStateList tint)は背景色を変更しなくなりました

サポートライブラリをに更新 Android Support Library to 23.2.1

使用設計支援ライブラリ(23.2.1)およびappcompatwidgets 以下のように

プレロリポップデバイスのマテリアルデザイン

AppCompat(別名ActionBarCompat)は、Gingerbreadで実行されているデバイス用のAndroid 4.0 ActionBar APIのバックポートとして始まり、バックポートされた実装とフレームワークの実装の上に共通のAPIレイヤーを提供しました。AppCompat v21は、Android5.0で最新のAPIと機能セットを提供します


Androidサポートライブラリ22.1

AppCompatの使用時にウィジェットに自動的に色を付ける機能は、アプリ全体で強力なブランディングと一貫性を維持するのに非常に役立ちます。これは、レイアウトを拡張するときに自動的に行われます。ButtonをAppCompatButtonに、TextViewをAppCompatTextViewに置き換えるなど、それぞれが色付けをサポートできるようにします。このリリースでは、これらの色合い対応ウィジェットが公開され、サポートされているウィジェットの1つをサブクラス化する必要がある場合でも、色合いのサポートを維持できます。



2

サポートライブラリのソースコードを調べると、通常は既知のボタンに色が付いていることがわかりますが、ボタンの形状を変更すると(丸いボタンがあります)、api <= 21では色合いが機能しません。また、TintManagerがパブリッククラス(appcompat-v7:23.1.1)になったことがわかります。そのため、現在のテーマのデフォルトのボタンの形(5.0では正常に色付けされています)からColorStateListを取得できます(配列を作成する必要はありません)。色の):

    Context c = ...; // activity
    AppCompatButton ab = ...; // your button
    // works ok in 22+:
    if (Build.VERSION.SDK_INT <= 21) {
        // default appcompat button, that is tinted ok with current theme colors "abc_btn_default_mtrl_shape":
        // ColorStateList tint = TintManager.get(c).getTintList(R.drawable.abc_btn_default_mtrl_shape);
        // Appcompat 23.2 change:
        ColorStateList tint = AppCompatDrawableManager.get().getTintList(c, R.drawable.abc_btn_default_mtrl_shape);
        ab.setSupportBackgroundTintList(tint);
        }

appcompat 23.2以降、クラスを変更しました(ただし、公開されています)。TintManager-> AppCompatDrawableManagerコードはほぼ同じです
Pavel Biryukov

WTF ... getTintListがパブリックから保護に変更されました;(リフレクションを使用する必要があります:)
Pavel Biryukov 2016年

0

属性backgroundTintはAPIレベル21以降でのみ使用されるため


私はそれを認識しており、実際にLollipopデバイスでテストしています。これを明確にするために質問を更新します。
BoD 2015年

0

recyclerviewの最新のlibがこのバグを引き起こす可能性があることに注意してください。

このコマンド

  sendBtnView.setBackgroundTintList(colorState)

過去には完璧に機能しましたが、私のために機能するのをやめます。調査の結果、原因はgradleの依存関係に追加されたlibであることが判明しました。

  compile 'com.android.support:recyclerview-v7:+'

そこで、Amit Vaghelaの投稿で推奨されているように、23.02.1に変更しようとしました。に変更しました

  compile  'com.android.support:recyclerview-v7:23.02.1'

しかし、gradleエラーは、recyclerview libにこのバージョン(23.02.1)がないことを示しました(gradleはJcenter raw.githubまたはrepoでそれを見つけることができませんでした)。

次に、setBackgroundTintListコマンドが、gradleの依存関係にある他のすべてのライブラリのバージョン22.02.0 'で以前はうまく機能していたことを知っていたためです。だから私はそれを次のように変更します:

compile   'com.android.support:recyclerview-v7:22.02.0'

そして今、それは再び機能します。


0

これが推奨されるかどうかはわかりませんが、これを試すことができます:

Drawable newDrawable = mBtnAction.getBackground();  // obtain Bg drawable from the button as a new drawable
DrawableCompat.setTint(newDrawable, mActivity.getHomeTobBarBGColor());  //set it's tint
mBtnAction.setBackground(newDrawable);  //apply back to button

一般的な意味でそれは機能します。試しましたViewCompatが、正しく動作しないようです。


0

あなたが使用することができますbackgroundTint <android.support.design.button.MaterialButton"com.android.support:design:28.0.0-rc01"バージョン


0

androidxを使用している場合は、接頭辞付きと接頭辞なしの両方のバージョンを追加すると、Android5.1で問題が解決しました。

<style name="Button_Primary">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:backgroundTint">@color/button_primary_selector</item>
    <item name="backgroundTint">@color/button_primary_selector</item><!--needed for android 5-->
</style>

button_primaryセレクターは、color次のコンテンツを含むフォルダーにあります。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:local="http://schemas.android.com/apk/res-auto">
    <item android:state_enabled="true" android:color="@android:color/holo_blue_dark" />
    <item android:state_enabled="false" android:color="@android:color/darker_gray" />
</selector>

上の通常のボタンに適用します AppCompatActivity

<Button style="@style/Button_Primary"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.