it-swarm.dev

Materyal Tasarımı ve AppCompat ile Android'de Renk Düğmeleri

AppCompat güncellemesi bugün yayınlanmadan önce Android L'deki düğmelerin rengini değiştirebildim, ancak eski sürümlerde değil. Yeni AppCompat güncellemesini ekledikten sonra, her iki sürüm için de rengi değiştiremiyorum, denediğimde düğme kayboluyor. Düğme rengini değiştirmeyi bilen var mı?

Aşağıdaki resimler neyi başarmak istediğimi gösteriyor:

picture showing desired result

Beyaz düğme varsayılan, kırmızı olan istediğim şey.

Bu daha önce styles.xml içindeki düğmelerin rengini değiştirmek için yaptığım şeydi:

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

ve bunu dinamik olarak yapmak için:

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

Ayrıca tema ebeveynini @Android:style/Theme.Material.Light.DarkActionBar 'dan Theme.AppCompat.Light.DarkActionBar' e değiştirdim

237
mail929

Resmen Destek Kütüphanesi rev.22'de düzeltildi (13 Mart 2015, Cuma). İlgili google kod sorununa bakın:

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

Kullanım örneği

theme.xml:

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

v21/theme.xml

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

Düzenleme (22.06.2016):

Appcompat kütüphanesi, orijinal yanıtı gönderdikten sonra malzeme düğmelerini desteklemeye başladı. Bu yazıda yükseltilmiş ve düz düğmelerin en kolay uygulandığını görebilirsiniz.

Orijinal cevap:

Bu AppCompat düğmeyi desteklemediğinden henüz arka plan olarak xml kullanabilirsiniz. Bunu yapmak için Android'in kaynak koduna baktım ve ilgili malzeme düğmelerine ilişkin dosyaları buldum.

1 - Malzeme düğmesinin orijinal uygulamasına kaynaktan bakın.

Android kaynak kodunda btn_default_material.xml dosyasına bir göz atın .

Dosyayı projeleriniz drawable-v21 klasörüne kopyalayabilirsiniz. Fakat buradaki renk attrına dokunmayın. Değiştirmeniz gereken dosya ikinci dosyadır.

çekilebilir-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 - Orijinal malzeme düğmesinin şeklini al

Farkında olduğunuz gibi, bu çizilebilir içerisinde kullanılan kaynak kodunun bu dosyasını içinde bulabileceğiniz bir şekil vardır.

<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 - Malzeme düğmesinin boyutlarını alma

Ve bu dosyada burada bulabilirsiniz bulabileceğiniz dosyadan kullanılan bazı boyutlar vardır. Tüm dosyayı kopyalayabilir ve değerler klasörünüze ekleyebilirsiniz. Bu, tüm düğmelere aynı malzemeyi (malzeme düğmelerinde kullanılan) uygulamak için önemlidir.

4 - Eski versiyonlar için başka bir çekilebilir dosya oluşturun

Daha eski sürümler için aynı ada sahip başka bir çekmeceye sahip olmalısınız. Öğeleri doğrudan referans vermek yerine satıra yerleştiriyorum. Onlara referans vermek isteyebilirsiniz. Fakat yine de, en önemli şey, malzeme düğmesinin orijinal boyutları.

çekilebilir/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>

Sonuç

Düğmenizin Lollipop cihazlarda dalgalanma etkisi olacaktır. Eski versiyonlar, dalgalanma efekti dışında tamamen aynı butona sahip olacak. Ancak farklı devletler için çekmeceler sağladığınızdan, onlar da dokunma olaylarına (eski haliyle) cevap vereceklerdir.

148
eluleci

Bu, daha fazla tema eklenmesiyle birlikte AppCompat kütüphanesinin v23.0.0 sürümünde geliştirilmiştir.

Widget.AppCompat.Button.Colored

Her şeyden önce, daha önce yapmadıysanız appCompat bağımlılığını içerir.

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

uygulama uyumluluğunun v23'ünü kullanmanız gerektiğinden, SDK-v23'ü de hedeflemeniz gerekecek!

    compileSdkVersion = 23
    targetSdkVersion = 23

values/theme adresinizde

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

values/style adresinizde

<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 adresinizde

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

Düğme temanız Widget.AppCompat.Button.Colored tabanlı olduğundan, düğme üzerindeki metin rengi varsayılan olarak beyazdır!

ancak düğmeyi devre dışı bıraktığınızda bir sorun var gibi görünüyor; düğme rengini açık gri olarak değiştirecek, ancak metin rengi beyaz kalacak!

bunun için bir çözüm, düğmedeki metin rengini özellikle beyaz olarak ayarlamaktır! Yukarıda gösterilen tarzda yaptığım gibi.

şimdi düğmenizi tanımlayabilir ve AppCompat'ın gerisini yapmasına izin verebilirsiniz :)

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

Engelli Devleti Disabled state

Etkin Durum Enabled State

Düzenle:

<Button Android:theme="@style/BrandButtonStyle"/> eklemek için

107
Muhammad Alfaifi

Android Destek Kütüphanesi 22.1.0'da, Google Button tonunu farkettirdi. Bu nedenle, düğmenin arka plan rengini özelleştirmenin başka bir yolu backgroundTint niteliğini kullanmaktır.

Örneğin,

<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

Renkli düğmeleri desteklemek için en son AppCompat kitaplığını kullanın (> 23.2.1):

şişirmek - XML

AppCompat Widget:

Android.support.v7.widget.AppCompatButton

AppCompat Stili:

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

NB! Özel bir rengi xml olarak ayarlamak için: app yerine attr: Android kullanın

(alt+enter kullanın veya app kullanmak için xmlns:app="http://schemas.Android.com/apk/res-auto" öğesini bildirin)

ygulama: backgroundTint = "@ renkli/your_custom_color"

Örnek:

<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"/>

veya programlı olarak ayarlayın - Java

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

En yeni Destek Kitaplığı ile, size AppCompatActivity adresindeki aktivitenizi devralabilirsiniz, bu yüzden Button'nizi AppCompatButton olarak şişirir ve SomeButtonStyle olan Android:theme="@style/SomeButtonStyle" işlevini kullanarak mizanpajdaki her bir düğmenin rengini stilize etme fırsatı sunar.

<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'de çalıştı.

25
Artem

stilin altında istiyorsanız

enter image description here

bu stile düğmeyi ekle

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

bu tarz istersen

enter image description here

aşağıdaki kodu ekle

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

Cevap TEMASI tarzı değil

Sorun, Düğme renginin temanın colorButtonNormal öğesine yapışmasıdır. Şansım olmadan Stili birçok farklı şekilde değiştirmeye çalıştım. Bu yüzden düğme temasını değiştirdim.

ColorButtonNormal ve colorPrimary ile bir tema oluşturun:

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

Bu temayı düğmede kullan

<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" herhangi bir şeyi genişletebilir olabilir Düğme stili burada olduğu gibi Metin rengi için birincil renk kullanırım:

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

Ve düğme, malzeme tasarımına uyumlu istediğiniz renkte olsun.

13
lonelyboycs

Düğme rengini ve dalgalanma rengini kolayca değiştirebilmenizi sağlayan bir Android kitaplığı oluşturdum

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"/>

Renkleri rastgele özelleştirebilmenizi sağlayan, farklı bir renkte zekâ istediğiniz her düğme için bir stil oluşturmanıza gerek yok

4
xgc1986

bu çalışma benim için Android + 4.0'da appcompat-v7: 22.2.0 ile yapıldı

styles.xml'nizde

<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>

düzen dosyanızda

<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

Düzen:

<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>

renk/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>

renk/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

Burada ImageButton kullananlar için bunu nasıl yapacağınız:

Style.xml'de:

<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 dosyasında:

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

Sonra düzen dosyanızda:

<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 ile stil çözümü kullanıyorsanız, Widget.AppCompat.Button.Colored 'dan miras almayı unutmayın etkisi çalışıyor;)

Sevmek

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

Yalnızca "Düz" malzeme düğmesini istiyorsanız, arka planlarını selectableItemBackground özelliğini açıklandığı şekilde özelleştirebilirsiniz burada .

1
kiruwka

AppCompat stilini Widget.AppCompat.Button, Base.Widget.AppCompat.Button.Colored, vb. Gibi kullanmak istiyorsanız, bu stilleri uyumlu görünümlerle kullanmanız gerekir. destek kütüphanesinden.

Aşağıdaki kod lolipop öncesi cihazlar için çalışmıyor:

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

AppCompat stillerini etkinleştirmek için AppCompatButton kullanmanız gerekir:

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

Benim için sorun, Android 5.0'da Android:colorButtonNormal'ın hiçbir etkisinin olmadığı ve aslında, temanın hiçbir öğesinde (Android:colorAccent gibi), ancak Android 4.4.3'te olduğu gibi oldu. Proje compileSdkVersion ve targetSdkVersion - 22 ile yapılandırıldı, bu yüzden tüm değişiklikleri @Muhammad Alfaifi'nin önerdiği gibi yaptım, fakat sonunda sorunun sorunun buildToolsVersion olduğunu gördüm. güncellenmedi. Bir kere 23.0.1 olarak değiştirdiğimde, her şey neredeyse normal bir şekilde çalışmaya başladı. Şimdi, Android:colorButtonNormal hala bir etkiye sahip değildir, ancak en azından düğme benim için kabul edilebilir olan Android:colorAccent öğesine tepki verir.

Umarım bu ipucu birine yardım edebilir. Not: Düğmeyi Android:theme=[...] 'ın da etkisi olmadığından stili doğrudan düğüme uyguladım.

1
Bianca D.

Bunu kullanıyorum. Dalgalanma etkisi ve düğme tıklama gölge çalışma.

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>

Düzen üzerindeki düğme:

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

AppCompatButton kullanarak başka bir basit çözüm

<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

GÜNCELLEŞTİRME

Aşağıdaki gibi tasarım destek kitaplığını (23.2.0) ve appcompatwidgets kullanın.

Android Destek Kütüphanesinde 22.1'de:

Bu, düzenleri şişirirken otomatik olarak yapılır - Düğmeyi AppCompatButton, TextView ile AppCompatTextView vb. İle değiştirmek, her birinin renklendirmeyi desteklemesini sağlamak için. Bu sürümde, renk tonu tanıyan widget'lar artık halka açıktır ve desteklenen widget'lardan birini alt sınıfa almanız gerekse bile renk tonu desteğini korumanıza olanak tanır.

Renk tonu widget'larının tam listesi:

AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView

Lolipop Öncesi Cihazlar için Materyal Tasarımı:

AppCompat (aka ActionBarCompat), Gingerbread üzerinde çalışan cihazlar için Android 4.0 ActionBar API'sinin desteklenmesi olarak başladı, desteklenen uygulamanın ve çerçeve uygulamasının üstüne ortak bir API katmanı sağladı. AppCompat v21, Android 5.0 ile güncel olan bir API ve özellik kümesi sunar


1
Amit Vaghela

Bunu çıkarmanın bir yolu, sadece bir stile işaret etmenizi ve uygulamanızdaki TÜM düğmeleri aynı şekilde DEĞİLDİRMenizi sağlar.
Themes.xml'de bir tema ekle

    <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>

Şimdi styles.xml'de ekle

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

Şimdi düzeninizde, Düğmenizdeki STYLE'yi işaret edin

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

Aslında özel düğme stillerimde değişiklik yapmak istemedim ama ne yazık ki artık çalışmıyorlardı.

Benim App 9 bir minSdkVersion var ve daha önce her şey çalıştı.

Nedenini bilmiyorum ama Android'i kaldırdığımdan beri: buttonStyle'den önce tekrar çalışıyor gibi görünüyor

şimdi = çalışıyor:

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

before = sadece gri materyal düğmeleri:

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

Düğmelerim oldukça düz olduğundan ve tüm Android sürümlerinde aynı görünmeleri gerektiğinden, newver Android sürümü için özel bir klasörüm yok.

Belki birileri neden "Android:" yazılımını kaldırmak zorunda olduğumu söyleyebilir. ImageButton hala "Android:" ile çalışıyor

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

Bu SO cevabı bir cevaba ulaşmama yardımcı oldu https://stackoverflow.com/a/30277424/307534

Bir düğmenin arka plan renk tonunu ayarlamak için bu yardımcı program yöntemini kullanıyorum. Lolipop öncesi cihazlarla çalışır:

// 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);
    }

}

Kodda nasıl kullanılır:

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

Bu şekilde, sadece arka plan tonunu ve başka hiçbir şeyi değiştirmek istemiyorsanız, güzel düğme efektlerini korumaktan başka bir şey yapmazsanız, bir ColorStateList belirtmeniz gerekmez.

0
Micro

android kullanın: backgroundTint = "@ color/customColor" ve bu, düğmeye özel renk verecektir. Bu kadar basit.

0
SuKu

Düğme temamda Android:textColor@null olarak ayarlarım ve yardımcı olur.

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" />

Şimdi düğme metni rengi colorAccent içinde tanımlanmış 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

Tek bir düğmenin rengini değiştirmek için

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

Cevapları aradıktan 2 gün sonra, düğme teması benim için API <21'de işe yaramadı.

Tek çözümüm yalnızca "colorButtonNormal" temel uygulama temasıyla değil, aynı zamanda backgroundTint gibi görünüm temasıyla da AppCompatButton tonlamasını geçersiz kılmak

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);
    }
}

Düğme renginizi şu şekilde tanımlayabilirsiniz:

<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.