web-dev-qa-db-ja.com

材料設計とAppCompatでAndroidのボタンを着色

AppCompatアップデートが本日発表される前は、Android Lではボタンの色を変更できましたが、古いバージョンでは変更できませんでした。新しいAppCompatアップデートを含めた後は、どちらのバージョンの色も変更できません。ボタンをクリックしても消えてしまいます。ボタンの色を変更する方法を誰かが知っていますか?

次の写真は私が達成したいことを示しています。

picture showing desired result

白いボタンがデフォルトです、赤いボタンは私が欲しいものです。

これは私が以前styles.xmlのボタンの色を変えるためにしていたことです:

<item name="Android:colorButtonNormal">insert color here</item>

そしてそれを動的に行う:

button.getBackground().setColorFilter(getResources().getColor(insert color here), PorterDuff.Mode.MULTIPLY);

また、テーマの親を@Android:style/Theme.Material.Light.DarkActionBarからTheme.AppCompat.Light.DarkActionBarに変更しました。

236
mail929

Support Library rev.22(2015年3月13日(金))で正式​​に修正されました。関連するGoogleコードの問題を参照してください。

https://issuetracker.google.com/issues/37008632

使用例

theme.xml:

<item name="colorButtonNormal">@color/button_color</item>

v21/theme.xml

<item name="Android:colorButtonNormal">@color/button_color</item>
215
WindRider

編集(22.06.2016):

Appcompat libraryは、私が最初の回答を投稿した後に、マテリアルボタンをサポートするようになりました。 この記事では あなたはレイズドボタンとフラットボタンの最も簡単な実装を見ることができます。

元の答え:

そのAppCompatはまだボタンをサポートしていないので、背景としてxmlを使うことができます。そのために私はAndroidのソースコードを見て、スタイリングマテリアルボタンのための関連ファイルを見つけました。

1 - ソースからのマテリアルボタンのオリジナルの実装を見てください。

Androidソースコードのbtn_default_material.xml _を見てください。

ファイルをプロジェクトのdrawable-v21フォルダにコピーできます。しかし、ここで色attrに触れないでください。変更する必要があるファイルは2番目のファイルです。

drawable-v21/custom_btn.xml

<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:color="?attr/colorControlHighlight">
    <item Android:drawable="@drawable/btn_default_mtrl_shape" />
</ripple>

2 - 元のマテリアルボタンの形状を取得する

あなたが理解するように、あなたが ソースコードのこのファイル で見つけることができるこのdrawableの中で使われる形がある。

<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:insetLeft="@dimen/button_inset_horizontal_material"
   Android:insetTop="@dimen/button_inset_vertical_material"
   Android:insetRight="@dimen/button_inset_horizontal_material"
   Android:insetBottom="@dimen/button_inset_vertical_material">
<shape Android:shape="rectangle">
    <corners Android:radius="@dimen/control_corner_material" />
    <solid Android:color="?attr/colorButtonNormal" />
    <padding Android:left="@dimen/button_padding_horizontal_material"
             Android:top="@dimen/button_padding_vertical_material"
             Android:right="@dimen/button_padding_horizontal_material"
             Android:bottom="@dimen/button_padding_vertical_material" />
</shape>

3 - 材料ボタンの寸法を取得する

そしてこのファイルには ここで見つけることができます _ファイルから使われている寸法がいくつかあります。ファイル全体をコピーして、 values フォルダーに入れることができます。これは、同じサイズ(マテリアルボタンで使用されているサイズ)をすべてのボタンに適用するために重要です。

4 - 古いバージョン用の別の描画可能ファイルを作成する

古いバージョンでは、同じ名前の別のドロアブルを持っているべきです。参照ではなく直接アイテムをインラインに配置しています。それらを参照したいと思うかもしれません。しかし、繰り返しますが、最も重要なことは、マテリアルボタンの元の寸法です。

drawable/custom_btn.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <!-- pressed state -->
    <item Android:state_pressed="true">
        <inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:insetLeft="@dimen/button_inset_horizontal_material"
            Android:insetTop="@dimen/button_inset_vertical_material"
            Android:insetRight="@dimen/button_inset_horizontal_material"
            Android:insetBottom="@dimen/button_inset_vertical_material">
            <shape Android:shape="rectangle">
                <corners Android:radius="@dimen/control_corner_material" />
                <solid Android:color="@color/PRESSED_STATE_COLOR" />
                <padding Android:left="@dimen/button_padding_horizontal_material"
                    Android:top="@dimen/button_padding_vertical_material"
                    Android:right="@dimen/button_padding_horizontal_material"
                    Android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>

    <!-- focused state -->
    <item Android:state_focused="true">
        <inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:insetLeft="@dimen/button_inset_horizontal_material"
            Android:insetTop="@dimen/button_inset_vertical_material"
            Android:insetRight="@dimen/button_inset_horizontal_material"
            Android:insetBottom="@dimen/button_inset_vertical_material">
            <shape Android:shape="rectangle">
                <corners Android:radius="@dimen/control_corner_material" />
                <solid Android:color="@color/FOCUSED_STATE_COLOR" />
                <padding Android:left="@dimen/button_padding_horizontal_material"
                    Android:top="@dimen/button_padding_vertical_material"
                    Android:right="@dimen/button_padding_horizontal_material"
                    Android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>

    <!-- normal state -->
    <item>
        <inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:insetLeft="@dimen/button_inset_horizontal_material"
            Android:insetTop="@dimen/button_inset_vertical_material"
            Android:insetRight="@dimen/button_inset_horizontal_material"
            Android:insetBottom="@dimen/button_inset_vertical_material">
            <shape Android:shape="rectangle">
                <corners Android:radius="@dimen/control_corner_material" />
                <solid Android:color="@color/NORMAL_STATE_COLOR" />
                <padding Android:left="@dimen/button_padding_horizontal_material"
                    Android:top="@dimen/button_padding_vertical_material"
                    Android:right="@dimen/button_padding_horizontal_material"
                    Android:bottom="@dimen/button_padding_vertical_material" />
            </shape>
        </inset>
    </item>
</selector>

結果

あなたのボタンはロリポップデバイスに波及効果があります。古いバージョンは波紋効果を除いて全く同じボタンを持つでしょう。しかし、あなたがさまざまな状態のためのドロアブルを提供しているので、それらは(古い方法として)タッチイベントにも反応するでしょう。

148
eluleci

これはAppCompatライブラリのv23.0.0で強化され、以下のようなテーマが追加されました。

Widget.AppCompat.Button.Colored

あなたがまだ持っていないのであれば、まず最初にappCompatの依存関係を含めてください。

compile('com.Android.support:appcompat-v7:23.0.0') {
    exclude group: 'com.google.Android', module: 'support-v4'
}

アプリ互換のv23を使用する必要があるので、SDK-v23もターゲットにする必要があります。

    compileSdkVersion = 23
    targetSdkVersion = 23

あなたのvalues/theme

<item name="Android:buttonStyle">@style/BrandButtonStyle</item>

あなたのvalues/style

<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/yourButtonColor</item>
    <item name="Android:textColor">@color/White</item>
</style>

あなたのvalues-v21/style

<style name="BrandButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="Android:colorButtonNormal">@color/yourButtonColor</item>
    <item name="Android:textColor">@color/White</item>
</style>

ボタンのテーマはWidget.AppCompat.Button.Coloredに基づいているので、ボタンのテキストの色はデフォルトで白です。

ただし、ボタンを無効にすると問題が発生するようです。ボタンの色は薄い灰色に変わりますが、テキストの色は白のままになります。

これを回避するには、ボタンのテキストの色を特に白に設定します。私が上に示したスタイルでやったように。

ボタンを定義して、残りはAppCompatに任せることができます。

<Button
        Android:layout_width="200dp"
        Android:layout_height="48dp" />

無効状態 Disabled state

有効状態 Enabled State

編集する

<Button Android:theme="@style/BrandButtonStyle"/>を追加する

107

Android Support Library 22.1.0では、GoogleはButtonの色合いを認識させるようにしました。したがって、ボタンの背景色をカスタマイズするもう1つの方法は、backgroundTint属性を使用することです。

例えば、

<Button
       Android:id="@+id/add_remove_button"
       Android:layout_width="wrap_content"
       Android:layout_height="wrap_content"
       Android:backgroundTint="@color/bg_remove_btn_default"
       Android:textColor="@Android:color/white"
       tools:text="Remove" />
61
Manabu-GT

色付きのボタンをサポートするには、最新のAppCompatライブラリ(> 23.2.1 )を使用します。

膨らませる - XML

AppCompatウィジェット:

Android.support.v7.widget.AppCompatButton

AppCompatスタイル:

style="@style/Widget.AppCompat.Button.Colored"

NB! xmlにカスタムカラーを設定するには:appの代わりにattr:Androidを使用します。

appを使用するには、alt+enterを使用するか、xmlns:app="http://schemas.Android.com/apk/res-auto"を宣言してください)

app :backgroundTint = "@ color/your_custom_color"

例:

<Android.support.v7.widget.AppCompatButton
     style="@style/Widget.AppCompat.Button.Colored"
     app:backgroundTint="@color/your_custom_color"
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"     
     Android:text="Colored Button"/>

または プログラムによる設定 - Java

 ViewCompat.setBackgroundTintList(your_colored_button,
 ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));
38
TouchBoarder

最新のサポートライブラリを使用すると、アクティビティをAppCompatActivityから継承することができるため、ButtonAppCompatButtonとして膨らませ、使用してレイアウト上のすべてのボタンの色をスタイルできますof Android:theme="@style/SomeButtonStyle"、ここでSomeButtonStyleは次のとおりです。

<style name="SomeButtonStyle" parent="@Android:style/Widget.Button">
    <item name="colorButtonNormal">@color/example_color</item>
</style>

2.3.7、4.4.1、5.0.2で私のために働いた

25
Artem

あなたがスタイルの下にしたい場合

enter image description here

このスタイルをあなたのボタンに追加する

style="@style/Widget.AppCompat.Button.Borderless.Colored"

あなたがこのスタイルが欲しいなら

enter image description here

以下のコードを追加

style="@style/Widget.AppCompat.Button.Colored"
16
Jinu

答えは _ theme _ /ではありません

問題は、ボタンの色がテーマのcolorButtonNormalに固定されていることです。私は運なしでさまざまな方法でスタイルを変更しようとしました。 ボタンのテーマを変更しました

ColorButtonNormalおよびcolorPrimaryを使用してテーマを作成します。

<style name="ThemeAwesomeButtonColor" parent="AppTheme">
    <item name="colorPrimary">@color/awesomePrimaryColor</item>
    <item name="colorButtonNormal">@color/awesomeButtonColor</item>
</style>

このテーマをボタンで使う

<Button
        Android:id="@+id/btn_awesome"
        style="@style/AppTheme.Button"
        Android:theme="@style/ThemeAwesomeButtonColor"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/btn_awesome"/>

"AppTheme.Button"は、ここでのようにButtonスタイルを拡張するものであれば何でもかまいません。テキストの色には原色を使用します。

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
    ...
    <item name="Android:textColor">?attr/colorPrimary</item>
    ...
</style>

そして、あなたはあなたが材料設計にその互換性があることを望むどんな色ででもボタンを手に入れます。

13
lonelyboycs

ボタンの色と波紋の色を簡単に変更できるAndroidライブラリを作成しました。

https://github.com/xgc1986/RippleButton

<com.xgc1986.ripplebutton.widget.RippleButton
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:id="@+id/btn"
    Android:text="Android button modified in layout"
    Android:textColor="@Android:color/white"
    app:buttonColor="@Android:color/black"
    app:rippleColor="@Android:color/white"/>

あなたはあなたが色をランダムにカスタマイズすることを可能にするあなたが欲しいすべてのボタンのために異なる色でスタイルを作成する必要はない

4
xgc1986

appcompat-v7を使った私のためのこの仕事:Android + 4.0の22.2.0

styles.xmlで

<style name="Button.Tinted" parent="Widget.AppCompat.Button">
    <item name="colorButtonNormal">YOUR_TINT_COLOR</item>
    <item name="colorControlHighlight">@color/colorAccent</item>
    <item name="Android:textColor">@Android:color/white</item>
</style>

レイアウトファイル内

<Button
    Android:id="@+id/but_next"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/but_continue"
    Android:theme="@style/Button.Tinted" />
4
ingyesid

レイアウト:

<Android.support.v7.widget.AppCompatButton
  style="@style/MyButton"
  ...
  />

styles.xml:

<style name="MyButton" parent="Widget.AppCompat.Button.Colored">
  <item name="backgroundTint">@color/button_background_selector</item>
  <item name="Android:textColor">@color/button_text_selector</item>
</style>

color/button_background_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_enabled="false" Android:color="#555555"/>
    <item Android:color="#00ff00"/>
</selector>

color/button_text_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_enabled="false" Android:color="#888888"/>
    <item Android:color="#ffffff"/>
</selector>
4
BArtWell

ImageButtonを使っている人のために、ここにあなたがそうする方法があります:

Style.xmlでは、

<style name="BlueImageButton" parent="Base.Widget.AppCompat.ImageButton">
    <item name="colorButtonNormal">@color/primary</item>
    <item name="Android:tint">@color/white</item>
</style>

v21/style.xmlでは、次のようになります。

<style name="BlueImageButton" parent="Widget.AppCompat.ImageButton">
    <item name="Android:colorButtonNormal">@color/primary</item>
    <item name="Android:tint">@color/white</item>
</style>

それからあなたのレイアウトファイルで:

<Android.support.v7.widget.AppCompatImageButton
    Android:id="@+id/my_button"
    Android:theme="@style/BlueImageButton"
    Android:layout_width="42dp"
    Android:layout_height="42dp"
    Android:layout_gravity="center_vertical"
    Android:src="@drawable/ic_check_black_24dp"
    />
3
Micro

colorButtonNormal を使用してスタイルソリューションを使用する場合は、 Widget.AppCompat.Button.Colored から継承することを忘れないでください。リップル効果が機能します。

好き

<style name="CustomButtonStyle" parent="Widget.AppCompat.Button.Colored">
      <item name="colorButtonNormal">@Android:color/white</item>
</style>
3
didi.yeah

あなたが "Flat"マテリアルボタンだけが欲しいなら、あなたは here で説明されているように selectableItemBackground 属性を使ってそれらの背景をカスタマイズすることができます。

1
kiruwka

Widget.AppCompat.Button Base.Widget.AppCompat.Button.Colored などのAppCompatスタイルを使用する場合は、サポートライブラリの互換ビューでこれらのスタイルを使用する必要があります。

以下のコードは、リポロップ前装置では機能しません。

<Button
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   Android:theme="@style/Widget.AppCompat.Button" />

AppCompatスタイルを有効にするには、AppCompatButtonを使用する必要があります。

<Android.support.v7.widget.AppCompatButton
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   Android:theme="@style/Widget.AppCompat.Button" />
1
farukcankaya

私にとって問題は、Android 5.0ではAndroid:colorButtonNormalは効果がなく、実際にはテーマからの項目(Android:colorAccentのような)はありませんでしたが、例えばAndroid 4.4.3ではそうでした。プロジェクトは22までcompileSdkVersiontargetSdkVersionで設定されていたので、@ Muhammad Alfaifiが提案したようにすべての変更を加えましたが、結局、問題は buildToolsVersion であり、更新されなかったことに気付きました。 。 23.0.1 に変更すると、すべて正常に動作し始めます。今、Android:colorButtonNormalはまだ効果がありませんが、少なくともボタンはAndroid:colorAccentに反応します。これは私には受け入れられます。

このヒントが誰かに役立つことを願っています。注:ボタンのAndroid:theme=[...]も効果がないため、ボタンにスタイルを直接適用しました。

1
Bianca D.

私はこれを使います。波紋効果とボタンクリックシャドウが機能します。

style.xml

<style name="Button.Red" parent="Widget.AppCompat.Button.Colored">
    <item name="Android:textColor">@color/material_white</item>
    <item name="Android:backgroundTint">@color/red</item>
</style>

レイアウト上のボタン:

<Button
        style="@style/Button.Red"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/close"/>
1
Mete

AppCompatButtonを使用したもう1つの簡単な解決策

<Android.support.v7.widget.AppCompatButton
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"
     style="@style/Widget.AppCompat.Button.Colored"
     app:backgroundTint="@color/red"
     Android:text="UNINSTALL" />
1
Hanzyusuf

更新

以下のように デザインサポートライブラリ(23.2.0) appcompatwidgets を使用してください。

Androidサポートライブラリ22.1 -

これはレイアウトを膨らませるとき自動的に行われます - ButtonをAppCompatButtonに、TextViewをAppCompatTextViewに置き換えるなど、それぞれが色付けをサポートできるようにします。このリリースでは、これらの色味を意識したウィジェットが公開されているので、サポートされているウィジェットの1つをサブクラス化する必要がある場合でも、色付けサポートを維持できます。

色味認識ウィジェットの全リスト:

AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView

プリロリポップデバイスの材料設計

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


1
Amit Vaghela

これをやってのける1つの方法はあなたがちょうどスタイルを指し示すことを可能にし、あなたのアプリのすべてのボタンを同じテーマにすることはできません。
themes.xmlにテーマを追加します

    <style name="Theme.MyApp.Button.Primary.Blue" parent="Widget.AppCompat.Button">
        <item name="colorButtonNormal">@color/someColor</item>
        <item name="Android:textColorPrimary">@Android:color/white</item>
    </style>

これでstyles.xmlに追加

    <style name="MyApp.Button.Primary.Blue" parent="">
        <item name="Android:theme">@style/Theme.MyApp.Button.Primary.Blue</item>
    </style>

今すぐあなたのレイアウトで単にあなたのボタンのスタイルを指す

    <Button
        ...
        style="@style/MyApp.Button.Primary.Blue"
        ...  />

私は実際に私のカスタムボタンのスタイルを変更したくありませんでしたが、残念ながらそれらはもう機能していませんでした。

私のアプリは9のminSdkVersionを持っており、すべてが前に働いていました。

理由はわかりませんが、Androidを削除したのでbuttonStyleの前には動作しているようです

今=働く:

<item name="buttonStyle">@style/ButtonmyTime</item>

変更前=グレーのマテリアルボタン:

<item name="Android:buttonStyle">@style/ButtonmyTime</item>

私のボタンは非常に平らであり、それらはすべてのAndroidバージョンで同じように見えるはずなので、私は新しいAndroidバージョン用の特別なフォルダを持っていません。

多分誰かが私が "Android:"を削除しなければならなかった理由を私に言うことができますImageButtonはまだ "Android:"で動作しています

<item name="Android:imageButtonStyle">@style/ImageButtonmyTimeGreen</item>
0
stefan

このSO回答は私が回答を得るのに役立ちました https://stackoverflow.com/a/30277424/3075340

このユーティリティメソッドを使ってボタンの背景色を設定します。ロリポップ以前のデバイスで動作します。

// Set button background tint programmatically so it is compatible with pre-Lollipop devices.
public static void setButtonBackgroundTintAppCompat(Button button, ColorStateList colorStateList){
    Drawable d = button.getBackground();
    if (button instanceof AppCompatButton) {
        // appcompat button replaces tint of its drawable background
        ((AppCompatButton)button).setSupportBackgroundTintList(colorStateList);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        // Lollipop button replaces tint of its drawable background
        // however it is not equal to d.setTintList(c)
        button.setBackgroundTintList(colorStateList);
    } else {
        // this should only happen if
        // * manually creating a Button instead of AppCompatButton
        // * LayoutInflater did not translate a Button to AppCompatButton
        d = DrawableCompat.wrap(d);
        DrawableCompat.setTintList(d, colorStateList);
        button.setBackgroundDrawable(d);
    }

}

コードで使用する方法:

Utility.setButtonBackgroundTintAppCompat(myButton,
ContextCompat.getColorStateList(mContext, R.color.your_custom_color));

こうすれば、単に背景の色合いを変更したいだけの場合は、ColorStateListを指定する必要はありませんが、きれいなボタン効果を維持し、それ以外の場合は維持します。

0
Micro

android:backgroundTint = "@ color/customColor"を使用すると、ボタンの色がカスタマイズされます。それは簡単です。

0
SuKu

ボタンのテーマでAndroid:textColor@nullに設定すると、役に立ちます。

styles.xml

<style name="Button.Base.Borderless" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="Android:textColor">@null</item>
</style>

some_layout.xml

<Button
    style="@style/Button.Base.Borderless"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="@string/hint" />

ボタンのテキストの色はcolorAccentで定義されるAppThemeになりました

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="colorAccent">@color/colorAccent</item>
    <item name="borderlessButtonStyle">@style/Button.Base.Borderless</item>
    <item name="alertDialogTheme">@style/AlertDialog</item>
</style>
0
Denis Rybnikov

単一ボタンの色を変更する

ViewCompat.setBackgroundTintList(button, getResources().getColorStateList(R.color.colorId));
0
Jaydeep

答えを探して2日後、ボタンテーマはAPI <21で私にはうまくいきませんでした。

私の唯一の解決策は、AppCompatButtonの色付けを、基本のアプリテーマ「colorButtonNormal」だけでなく、ビューのbackgroundTintもこのようにオーバーライドすることです。

public class AppCompatColorButton extends AppCompatButton {

    public AppCompatColorButton(Context context) {
        this(context, null);
    }

    public AppCompatColorButton(Context context, AttributeSet attrs) {
        this(context, attrs, Android.support.v7.appcompat.R.attr.buttonStyle);
    }

    public AppCompatColorButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if (TintManager.SHOULD_BE_USED) {
            setSupportBackgroundTintList(createButtonColorStateList(getContext(), attrs, defStyleAttr));
        }
    }

    static final int[] DISABLED_STATE_SET = new int[]{-Android.R.attr.state_enabled};
    static final int[] FOCUSED_STATE_SET = new int[]{Android.R.attr.state_focused};
    static final int[] PRESSED_STATE_SET = new int[]{Android.R.attr.state_pressed};
    static final int[] EMPTY_STATE_SET = new int[0];

    private ColorStateList createButtonColorStateList(Context context, AttributeSet attrs, int defStyleAttr) {
        final int[][] states = new int[4][];
        final int[] colors = new int[4];
        int i = 0;

        final int themeColorButtonNormal = ThemeUtils.getThemeAttrColor(context, Android.support.v7.appcompat.R.attr.colorButtonNormal);
        /*TypedArray a = context.obtainStyledAttributes(attrs, new int[] { Android.R.attr.backgroundTint }, defStyleAttr, 0);
        final int colorButtonNormal = a.getColor(0, themeColorButtonNormal);*/
        TypedArray a = context.obtainStyledAttributes(attrs, Android.support.v7.appcompat.R.styleable.View, defStyleAttr, 0);
        final int colorButtonNormal = a.getColor(Android.support.v7.appcompat.R.styleable.View_backgroundTint, themeColorButtonNormal);
        a.recycle();
        final int colorControlHighlight = ThemeUtils.getThemeAttrColor(context, Android.support.v7.appcompat.R.attr.colorControlHighlight);

        // Disabled state
        states[i] = DISABLED_STATE_SET;
        colors[i] = ThemeUtils.getDisabledThemeAttrColor(context, Android.support.v7.appcompat.R.attr.colorButtonNormal);
        i++;

        states[i] = PRESSED_STATE_SET;
        colors[i] = ColorUtils.compositeColors(colorControlHighlight, colorButtonNormal);
        i++;

        states[i] = FOCUSED_STATE_SET;
        colors[i] = ColorUtils.compositeColors(colorControlHighlight, colorButtonNormal);
        i++;

        // Default enabled state
        states[i] = EMPTY_STATE_SET;
        colors[i] = colorButtonNormal;
        i++;

        return new ColorStateList(states, colors);
    }
}

これでボタンの色を次のように定義できます。

<com.example.views.AppCompatColorButton
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:backgroundTint="#ffff0000"
            app:backgroundTint="#ffff0000"
            Android:text="Button"
            Android:textColor="@Android:color/white" />
0
Thomas G.