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


256

AppCompatGüncelleme bugün çıkmadan önce Android L'deki düğmelerin rengini değiştirebildim, ancak eski sürümlerde değiştiremedim. Yeni AppCompat güncellemesini ekledikten sonra, her iki sürümün rengini değiştiremiyorum, denediğimde düğme kayboluyor. Düğme renginin nasıl değiştirileceğini bilen var mı?

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

istenen sonucu gösteren resim

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

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

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

ve dinamik olarak yapmak için:

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

Ayrıca tema üst öğesini olarak @android:style/Theme.Material.Light.DarkActionBardeğiştirdimTheme.AppCompat.Light.DarkActionBar


Aynı denedim ama hiçbir şey Düğme rengini değiştirmedi. Ben de android kaldırdım: çünkü destek lib ve öznitelik android ad alanının bir parçası değil
Informatic0re

Android 5.0 kullanıyorsanız: Android 5.0 ile colorButtonNormal işe yarıyor - ancak geriye dönük olarak uyumlu görünmüyor
Informatic0re

Evet, yaşadığım şey tam olarak bu
mail929

Ayrıca vurgu renginin CheckBox rengini değiştirmediğini, ancak eski sürümlerde değiştiğini anladım
Informatic0re

artı bu dinamik yöntem için bir tane. :)
theapache64

Yanıtlar:


222

Resmi olarak Destek Kütüphanesi rev.22 (13 Mart 2015 Cum) ile düzeltildi. İlgili Google kodu 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>

17
Nasıl kullanılacağına dair bir örnek var mı? Renkleri tek bir Düğme üzerinde nasıl ayarlayabilirim?
Karmaşıklar

3
@WindRider Bir sorunum olsa da, farklı renklerde düğmeler oluşturmak için kullanmak istiyorum. Ben stilleri oluşturmak Button.Red, Button.Green, hepsi ebeveyn eşit Düğme temel tarzı ile eşittir. ColorButtonNormal öğesini istenen renge ayarladım, bunu düğme teması olarak ayarlayın. Ne yazık ki sadece 21 için düğmeleri renklendirir. Aşağıda temada tanımlanan colorButtonNormal'ı geçersiz kılmaz.
dominik4142

71
AppCompat 22.1.1 ile sadece bir düğme için 2.3.7, 4.4.4 ve 5.1'de benim için çalışır: düğmelerin ayarlanması android:theme="@style/ColoredButton"ve styles.xml içinde <style name="ColoredButton" parent="Widget.AppCompat.Button"> <item name="colorButtonNormal">@color/button_yellow</item> </style>
hunyadym

2
@hunyadym, düğmeye bir tema ekleyerek nedense onClick. Tasarım kitaplığı daha iyi bir yol sağlayana kadar bunu geçici bir çözüm olarak sınıflandırırdım.
gladed

3
@gladed: Durumunuzda sorun şu hata gibi görünüyor: code.google.com/p/android/issues/detail?id=62795#c1
hunyadym

148

Düzenleme (22.06.2016):

Appcompat kütüphanesi, orijinal yanıtı yayınladıktan sonra malzeme düğmelerini desteklemeye başladı. Bu gönderide yükseltilmiş ve düz düğmelerin en kolay uygulamasını görebilirsiniz.

Orijinal Yanıt:

Bu AppCompat düğmeyi desteklemediğinden, xml'yi arka plan olarak kullanabilirsiniz. Bunu yapmak için Android'in kaynak koduna bir göz attım ve malzeme düğmeleri şekillendirmek için ilgili dosyaları buldum.

1 - Materyal düğmesinin kaynaktan orijinal uygulanmasına bakın.

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

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

çekilebilirdir-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ın

Bildiğiniz gibi, bu çekmecenin içinde kullanılan ve kaynak kodun bu dosyasında bulabileceğiniz bir şekil var .

<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 bulabileceğiniz bazı boyutlar var . Tüm dosyayı kopyalayıp değerler klasörünüze koyabilirsiniz . Bu, tüm düğmelere aynı boyutta (malzeme düğmelerinde kullanılan) uygulamak için önemlidir

4 - Eski sürümler için başka bir çekilebilir dosya oluşturun

Daha eski sürümler için aynı ada sahip başka bir çekmeceniz olmalıdır. Yönlendirmek yerine öğeleri doğrudan satır içine koyuyorum. Onlara referans vermek isteyebilirsiniz. Ama yine de, en önemli şey malzeme düğmesinin orijinal boyutlarıdır.

ç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 cihazlarında dalgalanma etkisi olacaktır. Eski versiyonlar dalgalanma efekti dışında tamamen aynı düğmeye sahip olacak. Ancak farklı durumlar için çekilebilir malzemeler sağladığınızdan, dokunma olaylarına da (eski yol olarak) yanıt verirler.


4
Evet kesinlikle. Tüm düğmeler için aynı arka planı kullanıyorsanız ve bunu tekrar tekrar eklemek istemiyorsanız, stillerinizde bir düğme stili tanımlayın. Xml <style name = "ButtonStyle" parent = "android: Widget.Button"> < item name = "android: background"> ​​@ drawable / custom_btn </item> </style> ve temanıza düğme stili ekleyin <item name = "android: buttonStyle"> @ style / ButtonStyle </item>
eluleci

1
21 öncesi bu düğmeye nasıl yükseklik ekleyebilirim? anladığım gibi aşağıda gölge ile yeni bir şekil eklemek gerekir, ama tam olarak nereye koymak gerekir?
xakz

7
Bunun kutunun dışında desteklenmemesi çok can sıkıcı
Sam

39
Sana tamamiyle katılıyorum. Düğme en çok kullanılan widget'tır, ancak malzeme destek kütüphanesine dahil değildir. Ne düşündüklerini merak ediyorum.
eluleci

1
Ayrıca, rehberinizi izleyerek arka plan hiç görünmüyor gibi görünüyor ...
JMRboosties

111

Bu, AppCompat kütüphanesinin v23.0.0 sürümünde daha fazla tema eklenerek geliştirildi

Widget.AppCompat.Button.Colored

Öncelikle henüz 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'
}

artık uygulama uyumlu v23 kullanmanız gerektiğinden, SDK-v23'ü de hedeflemeniz gerekir!

    compileSdkVersion = 23
    targetSdkVersion = 23

Sizin values/theme

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

Sizin values/style

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

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

Düğme temanız şunlara dayandığından: Widget.AppCompat.Button.Colored Düğmedeki 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 griye değiştirecek, ancak metin rengi beyaz kalacak!

bunun için geçici bir çözüm, düğme üzerindeki metin rengini beyaza ayarlamaktır! Yukarıda gösterilen tarzda yaptığım gibi.

şimdi düğmenizi tanımlayabilir ve gerisini AppCompat'a bırakabilirsiniz :)

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

Engelli Durumu Devre dışı durumu

Etkin Durum Etkin Durum

Düzenle:

Eklemek <Button android:theme="@style/BrandButtonStyle"/>


19
Bunu yapmanın en iyi yolu, şimdi! Ayrıca stili düğmelerle ayrı ayrı da kullanabilirsiniz <Button android:theme="@style/BrandButtonStyle"/>. Bu olmak zorunda themenitelik ve değilstyle nitelik.
mohlendo

7
@Muhammad Alfaifi Bunun için örnek bir projeniz veya özünüz var mı? Temiz bir proje oluşturdum ve işe yaramıyor: github.com/Bresiu/ThemeTest . Aksanlı renkli Lolipop düğme renklerinde ve API v16'da düğme gri kalır: i.imgur.com/EVwkpk2.png
Bresiu

4
Bu sadece android: tema niteliğini belirlerken benim için çalıştı. Düğme stili ile benim için çalışmak için öznitelik stilini alamadım.
Ray Hunter

8
V23.1 lib kullanıldığında, bu düzgün çalışmadı, tüm temaya ayarlamaya çalışırken, vurgu rengini her zaman tanımlanan renk değil bg olarak gösterdi
Patrick Favre

3
Burada aynı sorun, v23.1'de devre dışı bırakılan düğme etkin düğmeyle aynı renktedir. çok sinir bozucu. kimse bu çözdü?
AhmedW

63

Android Destek Kütüphanesi 22.1.0'da Google Buttonrenk tonunu fark etti. Bu nedenle, düğmenin arka plan rengini özelleştirmenin başka bir yolu,backgroundTint özelliği .

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

1
En sonunda! 22.1 sürümü hakkında blog yazısı: android-developers.blogspot.no/2015/04/…
GuillermoMP

5
Belgeler şöyle diyor: "Bu, mizanpajlarınızda Button düğmesini kullandığınızda otomatik olarak kullanılacaktır. Bu sınıfı yalnızca özel görünümler yazarken manuel olarak kullanmanız gerekir." developer.android.com/reference/android/support/v7/widget/… bu, tüm düzenlerimizi ve java kodumuzu manuel olarak değiştirmek zorunda olmadığımız anlamına mı geliyor?
Stephane

@Stephane no, düzenleri değiştirmeliyiz. chris.banes.me/2015/04/22/support-libraries-v22-1-0
Anton Holovin

HARİKA! Şimdi, ToggleButtons'ın arka planını değiştirmenize izin veren bir AppCompatToggleButton var mı? Belki kodu intihal edebilirim ...
swooby

19
Ne yazık ki bu sadece API 21+ üzerinde çalışır. Android: backgroundTint özniteliği, AppCompat kütüphanesinde bile Lollipop öncesi çalışmaz. Lolipop öncesi yalnızca temadaki colorButtonNormal çalışır.
Timur_C

42

Renkli düğmeleri desteklemek için aşağıdakilerle birlikte en yeni AppCompat kitaplığını (> 23.2.1 ) kullanın:

şişirmek - XML

AppCompat Widget'ı:

android.support.v7.widget.AppCompatButton

AppCompat Stili:

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

NB! Xml'de özel bir renk ayarlamak için: appyerine attr:android

(kullanın alt+enterveya kullanmayı beyan xmlns:app="http://schemas.android.com/apk/res-auto"edin app)

app : backgroundTint = "@ renk / özel_renk"

Misal:

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

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

Java kodunuz benim için çalıştı. Ve Muhammed Alfaifi yanıtı düğmenin metin rengini ayarlamaya yardımcı oldu.
Micro

renk tonunu programlı olarak ayarlamanın kolay bir yolu var mı (arka plan değil)?
tonoz

Olağanüstü! 4.4.4 üzerinde de çalışıyor! Ve seçici durum da oldukça iyi korunuyor!
sud007

Dokümanlar başına : Bu, mizanpajlarınızdaki düğmeleri ayarlarken otomatik olarak kullanılır. Özel görünümler oluştururken yalnızca AppCompatButton belirtmeniz gerekir.
gMale

İlginç bir şekilde, XML değişiklikleri bir parça düzeninde mükemmel çalıştı, ancak bir Etkinlik düzeninde çalışmadı. Etkinlik düğmeleri yalnızca colorAccent kullandı. Programlı sürüm de çalıştı.
Leon

25

En son Destek Kütüphanesi ile sadece size aktiviteyi devralan olabilir AppCompatActivityo şişirmek senin olacak, böylece Buttonolarak AppCompatButtonve kullanımı ile size düzeninde her düğmenin stili rengine bir fırsat vermek android:theme="@style/SomeButtonStyle", nerede SomeButtonStyleolduğunu:

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


Teşekkürler!!! EditText stilini güncellemem gerektiğinden "Widget.AppCompat.EditText" için üst değeri değiştirdim.
Juan Saravia

3
Teşekkür ederim, benim için de çalıştı. Emin kullanmak olun android:themeve style. Ayrıca colorControlHighlightve ekleyebilirsiniz colorControlActivated.
Rachel

çalışmıyor, API 22, AppCompatActivity, tema Material.Light
Andrey Uglev

1
@AndreyUglev kullanmaya çalışın Theme.AppCompat.Light.
Artem

Merhaba, istenen rengi değiştirir AMA gölgeleri kaldırır.
Amio.io

16

stilin altında istiyorsanız

resim açıklamasını buraya girin

bu stili düğmene ekle

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

bu stili istiyorsan

resim açıklamasını buraya girin

aşağıdaki kodu ekle

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

1
compile 'com.android.support:appcompat-v7:23.1.0'Eklemek zorundasınız.
Pratik Butani

1
ancak soru, farklı renklere sahip malzeme düğmelerine nasıl sahip olacağınızdır, böylece hepsinin temanın ana rengi yoktur.
Apostrofix

15

Cevap THEME'de stilinde değil

Sorun, Button renginin temanın colorButtonNormal öğesine bağlı olmasıdır. Stili şanssız birçok farklı şekilde değiştirmeye çalıştım. Bu yüzden düğme temasını değiştirdim .

ColorButtonNormal ve color ile bir tema oluşturun

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

Düğmede bu temayı 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 şey olabilir gibi Düğme stilini uzatır Ben metin rengi için birincil renk kullanın:

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

Ve düğmeyi malzeme tasarımıyla uyumlu herhangi bir renkte elde edersiniz.


stillere ekleyebileceğim diğer özellikler nelerdir.
Sagar Nayak

4

Düğme rengini ve dalgalanma rengini kolayca değiştirmenize izin veren bir android kütüphanesi 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"/>

Farklı bir renge sahip olmak istediğiniz her düğme için bir stil oluşturmanız gerekmez, böylece renkleri rastgele özelleştirebilirsiniz


4

android + 4.0 appcompat-v7: 22.2.0 ile benim için bu çalışma

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

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

Merhaba, istenen rengi değiştirir AMA gölgeleri kaldırır.
Amio.io

Tekrar merhaba, görebiliyorum. Şimdi doğru davranış.
Amio.io

Java ile bunu nasıl yapabilirsiniz?
Micro

@MicroR yukarıdaki cevabı kontrol edin.
17'de ingyesid

4

Yerleşim:

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

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

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

3

ImageButtonBurada kullananlar için bunu nasıl yaparsınız:

Style.xml dosyasında:

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

Ardından 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"
    />

Bu yardımcı oldu .... Sanırım düğme stilini Düğme widget'ında bir stil yerine bir tema olarak uygulamak önemlidir. Style = "@ style / BlueImageButton" altında uyguluyordum ve işe yaramadı
velval

3

Birlikte tarzı çözümü kullanıyorsanız colorButtonNormal , devralan unutmayın Widget.AppCompat.Button.Colored , dalgalanma efektinin çalışması için ;)

Sevmek

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

2

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

2

kullanın:

android:backgroundTint="@color/customColor"

Ya da :

android:background="@color/customColor"

ve bu düğmeye özel renk verecektir.


1

Yalnızca "Düz" malzeme düğmesi istiyorsanız, burada açıklandığı gibi selectableItemBackground özniteliğini kullanarak arka planlarını özelleştirebilirsiniz .


"Renk tonu" renklerinden veya seçilen renklerden herhangi birini değiştirmek istemiyorsanız, bu, renkli düğmelerle geri bildirim almak için kesinlikle kolay bir çözümdür. Teşekkürler!
theblang

1

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

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

1

Benim için sorun, Android 5.0'da bunun android:colorButtonNormalhiçbir etkisi olmadığı ve aslında temanın (örneğin android:colorAccent) hiçbir öğesinin olmaması , ancak Android 4.4.3'te, örneğin, bunun olmamasıydı . Proje compileSdkVersionve targetSdkVersion22 ile yapılandırıldı , bu yüzden @Muhammad Alfaifi sugessted olarak tüm değişiklikleri yaptım, ama sonunda, sorunun güncellenmemiş buildToolsVersion olduğunu fark ettim . 23.0.1 olarak değiştirdiğimde , her şey neredeyse normal çalışmaya başlar. Şimdi, android:colorButtonNormalyine de bir etkisi yok, ama en azından android:colorAccentbenim için kabul edilebilir olan düğmeye tepki veriyor .

Umarım bu ipucu birine yardım edebilir. Not: Stili doğrudan düğmeye uyguladım, çünkü düğmenin android:theme=[...]de etkisi olmadı.


Neredeyse yeni @ style / Widget.AppCompat.Button.Colored;) kullanmanın% 100 doğru yolunu buldunuz - bu cevaba bakınız stackoverflow.com/a/35811157/19733911
16:16

1

Bunu çekmenin bir yolu, sadece bir stile işaret etmenizi ve uygulamanızdaki TÜM düğmelerin aynısını DEĞİL olarak belirlemenizi sağlar.
Themes.xml dosyasında tema ekleyin

    <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 mizanpajınızda Düğmenizdeki TARZı işaret edin

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

1

GÜNCELLEME

Kullanım tasarım destek kitaplığı (23.2.0) ve appcompatwidgets aşağıdaki gibi

Android Destek Kitaplığı 22.1'de :

Bu, düzenleri şişirirken otomatik olarak yapılır - her birinin renklendirmeyi desteklediğinden emin olmak için Button'ı AppCompatButton, TextView ve AppCompatTextView vb. İle değiştirir. Bu sürümde, bu renk tonu farkında widget'lar artık herkese açıktır ve desteklenen widget'lardan birini alt sınıflamanız gerekse bile renklendirme desteğini korumanıza izin verir.

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

AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView

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

AppCompat (diğer adıyla ActionBarCompat), Gingerbread üzerinde çalışan cihazlar için Android 4.0 ActionBar API'sının bir backport'u olarak başlatıldı ve rapor edilen uygulamanın ve çerçeve uygulamasının üstünde ortak bir API katmanı sağladı. AppCompat v21, Android 5.0 ile güncel olan bir API ve özellik kümesi sunar



1

Widget.AppCompat.Button , Base.Widget.AppCompat.Button.Colored gibi AppCompat stilini kullanmak istiyorsanız , bu stilleri destek kitaplığından uyumlu görünümlerle kullanmanız gerekir.

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

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

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

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

2
XML düzenleri şişirilirken uygulama uyumluluğu widget'ları otomatik olarak kullanılmıyor mu? Ben ImageViewyerini alır inanıyorum AppCompatImageViewve ilgili AppCompatsürümü olan tüm widget ile aynı olmalıdır .
d.aemon

Hayır, son hedef sürümü hedeflemezseniz, android.support.v7.widget.AppCompatImageViewaçıkça tanımlamanız gerekir .
farukcankaya

Ne demek istiyorsun last target version, @power?
d.aemon

1

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 düğmesi:

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

0

Aslında özel düğme stillerimde bir değişiklik istemiyordum ama maalesef artık çalışmıyorlardı.

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

Neden bilmiyorum ama android kaldırdığımdan beri: buttonStyle'dan önce tekrar çalışıyor gibi görünüyor

şimdi = çalışıyor:

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

önce = sadece gri malzeme 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, yeni android sürümü için hiçbir spezial klasörüm yok.

Belki birisi bana neden "android:" i kaldırmam gerektiğini söyleyebilir. ImageButton hala "android:" ile çalışıyor

<item name="android:imageButtonStyle">@style/ImageButtonmyTimeGreen</item>

0

Yanıt aradıktan 2 gün sonra, düğme teması API <21'de benim için çalışmadı.

Benim tek çözüm AppCompatButton renklendirme sadece temel uygulama teması "colorButtonNormal" ile değil, aynı zamanda görünüm backgroundTint ile geçersiz kılmaktır:

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

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

Bu SO yanıtı bir yanıta ulaşmama yardımcı oldu ulaşmama https://stackoverflow.com/a/30277424/3075340

Bir düğmenin arka plan tonunu ayarlamak için bu yardımcı yöntemi kullanın. 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 değiştirmek ve güzel düğme efektlerini korumak ve başka bir şey yapmak istemiyorsanız, bir ColorStateList belirtmeniz gerekmez.


0

Ben set android:textColoriçin @nullbenim düğme tema 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üğmesi metin rengi olduğu colorAccenttanımlananAppTheme

<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

kotlin kullanıyorsanız, MaterialButton öğesinin tüm niteliklerinin desteklendiğini görebilirsiniz. Android: background özniteliğini kullanmayın. MaterialButton kendi arka planını çizebilir ve yeni bir arka plan ayarlamak, Malzeme düğmesinin devre dışı bıraktığı rengin artık tanıttığı yeni özelliklerin düzgün çalışacağını garanti edemeyeceği anlamına gelir. Varsayılan arka plan değiştirilirse, Malzeme Düğmesi iyi tanımlanmış davranışı garanti edemez. MainActivity.kt sitesinde

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        buttonClick.setOnClickListener {
            (it as MaterialButton).apply {
                backgroundTintList = ColorStateList.valueOf(Color.YELLOW)
                backgroundTintMode = PorterDuff.Mode.SRC_ATOP
            }
        }
    }
}

Activity_main.xml adresinde

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/constraintLayout"
    tools:context=".MainActivity">
    <com.google.android.material.button.MaterialButton
        android:id="@+id/buttonNormal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="Material Button Normal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <com.google.android.material.button.MaterialButton
        android:id="@+id/buttonTint"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:backgroundTint="#D3212D"
        android:text="Material Button Background Red"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonNormal" />
    <com.google.android.material.button.MaterialButton
        android:id="@+id/buttonTintMode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:backgroundTint="#D3212D"
        android:backgroundTintMode="multiply"
        android:text="Tint Red + Mode Multiply"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonTint" />
    <com.google.android.material.button.MaterialButton
        android:id="@+id/buttonClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Click To Change Background"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonTintMode" />
</androidx.constraintlayout.widget.ConstraintLayout>

kaynak: Malzeme düğmesi renk değiştir örneği


0

bunu herhangi bir renkte kodla yapmak istiyorsanız bunu kullanın:

DrawableCompat.setTintList(button.getBackground(), ColorStateList.valueOf(yourColor));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.