Các nút tô màu trong Android với Thiết kế Vật liệu và AppCompat


256

Trước AppCompat bản cập nhật ra mắt hôm nay tôi đã có thể thay đổi màu của các nút trong Android L nhưng không phải trên các phiên bản cũ hơn. Sau khi bao gồm bản cập nhật AppCompat mới, tôi không thể thay đổi màu cho cả hai phiên bản, khi tôi thử, nút này sẽ biến mất. Có ai biết làm thế nào để thay đổi màu nút?

Những hình ảnh sau đây cho thấy những gì tôi muốn đạt được:

hình ảnh hiển thị kết quả mong muốn

Nút màu trắng là mặc định, nút màu đỏ là những gì tôi muốn.

Đây là những gì tôi đã làm trước đây để thay đổi màu của các nút trong styles.xml:

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

và để làm điều đó một cách linh hoạt:

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

Ngoài ra tôi đã làm thay đổi phụ huynh chủ đề từ @android:style/Theme.Material.Light.DarkActionBarđếnTheme.AppCompat.Light.DarkActionBar


Tôi đã thử tương tự nhưng không có gì thay đổi màu của Nút. Tôi cũng đã xóa android: khỏi thuộc tính vì nó là từ lib hỗ trợ và không phải là một phần của không gian tên android
Informatic0re

Nếu bạn đang sử dụng android: colorButtonN normal với Android 5.0 thì nó hoạt động - nhưng có vẻ như nó không tương thích ngược
Informatic0re

Vâng, đó chính xác là những gì tôi đã trải qua
mail929

Tôi cũng đã tìm ra rằng màu nhấn không thay đổi màu CheckBox, nhưng nó có trong các phiên bản cũ hơn
Informatic0re

cộng với một cho phương pháp động đó. :)
theapache64

Câu trả lời:


222

Chính thức được sửa trong Thư viện hỗ trợ rev.22 (Thứ Sáu ngày 13 tháng 3 năm 2015). Xem vấn đề mã google có liên quan:

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

Ví dụ sử dụng

chủ đề:

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

v21 / theme.xml

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

17
Có bất kỳ ví dụ làm thế nào để sử dụng nó? Làm cách nào tôi có thể đặt màu trên chỉ một Nút?
Mâu thuẫn

3
@WindRider Tôi có một vấn đề, tôi muốn sử dụng nó để tạo các nút với các màu khác nhau. Tôi tạo kiểu Nút.Red, Nút.Green, tất cả đều có cha mẹ bằng Kiểu cơ sở của Nút. Tôi đặt mục màuButtonN normal thành màu được yêu cầu, đặt mục này làm chủ đề nút. Thật không may, nó chỉ tô màu cho các nút 21. Dưới đây, nó không ghi đè lên màuButtonN normal được xác định trong chủ đề.
dominik4142 18/03/2015

71
Với AppCompat 22.1.1, nó cũng hoạt động với tôi vào các ngày 2.3.7, 4.4.4 và 5.1 chỉ cho một nút: cài đặt nút android:theme="@style/ColoredButton"và trong <style name="ColoredButton" parent="Widget.AppCompat.Button"> <item name="colorButtonNormal">@color/button_yellow</item> </style>
tệp style.xml

2
@hunyadym, thêm một chủ đề vào nút phá vỡ onClick vì một số lý do. Tôi sẽ phân loại nó như một cách giải quyết cho đến khi thư viện Design cung cấp một cách tốt hơn.
vui mừng

3
@gladed: Có vẻ như trong trường hợp của bạn, vấn đề là lỗi này: code.google.com/p/android/issues/detail?id=62795#c1
hunyadym

148

Chỉnh sửa (22.06.2016):

Thư viện Appcompat bắt đầu hỗ trợ các nút tài liệu sau khi tôi đăng phản hồi ban đầu. Trong bài viết này, bạn có thể thấy việc thực hiện dễ dàng nhất của các nút tăng và phẳng.

Câu trả lời gốc:

Vì AppCompat không hỗ trợ nút nhưng bạn có thể sử dụng xml làm hình nền. Để làm điều đó, tôi đã xem mã nguồn của Android và tìm thấy các tệp liên quan cho các nút vật liệu tạo kiểu.

1 - Nhìn vào việc thực hiện ban đầu của nút vật liệu từ nguồn.

Hãy xem btn_default_m vật liệu trên mã nguồn Android .

Bạn có thể sao chép tệp vào thư mục dự án drawable-v21. Nhưng đừng chạm vào màu attr ở đây. Tệp bạn cần thay đổi là tệp thứ hai.

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 - Lấy hình dạng của nút vật liệu ban đầu

Như bạn nhận ra có một hình dạng được sử dụng bên trong drawable này mà bạn có thể tìm thấy trong tệp mã nguồn này .

<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 - Lấy kích thước của nút vật liệu

Và trong tệp này, bạn có một số kích thước được sử dụng từ tệp mà bạn có thể tìm thấy ở đây . Bạn có thể sao chép toàn bộ tập tin và đưa vào thư mục giá trị của bạn . Điều này rất quan trọng để áp dụng cùng kích thước (được sử dụng trong các nút vật liệu) cho tất cả các nút

4 - Tạo một tệp có thể vẽ khác cho các phiên bản cũ

Đối với các phiên bản cũ hơn, bạn nên có một drawable khác có cùng tên. Tôi đang trực tiếp đặt các mục nội tuyến thay vì tham khảo. Bạn có thể muốn tham khảo chúng. Nhưng một lần nữa, điều quan trọng nhất là kích thước ban đầu của nút vật liệu.

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>

Kết quả

Nút của bạn sẽ có hiệu ứng gợn trên thiết bị Lollipop. Các phiên bản cũ sẽ có cùng một nút ngoại trừ hiệu ứng gợn. Nhưng vì bạn cung cấp các bản vẽ cho các trạng thái khác nhau, nên họ cũng sẽ phản hồi các sự kiện chạm (theo cách cũ).


4
Đúng chính xác. Nếu bạn sử dụng cùng một nền cho tất cả các nút và nếu bạn không muốn thêm cái này nhiều lần, hãy xác định kiểu nút trong tệp styleDB <style name = "ButtonStyle" Parent = "android: Widget.Button"> < tên mục = "android: nền"> @ drawable / custom_btn </ item> </ style> và thêm kiểu nút trong chủ đề của bạn <item name = "android: buttonStyle"> @ style / ButtonStyle </ item>
eluleci

1
Làm thế nào tôi có thể thêm độ cao cho nút này trên trước 21? theo tôi hiểu tôi nên thêm hình dạng mới với bóng bên dưới nút, nhưng chính xác tôi nên đặt nó ở đâu?
xakz

7
Rất khó chịu vì điều này không được hỗ trợ ngoài hộp
Sam

39
Tôi hoàn toàn đồng ý với bạn. Nút là tiện ích được sử dụng nhiều nhất nhưng nó không được bao gồm trong thư viện hỗ trợ cho tài liệu. Tôi tự hỏi họ đang nghĩ gì
eluleci

1
Ngoài ra, theo hướng dẫn của bạn, có vẻ như nền hoàn toàn không hiển thị ...
JMRboosties 13/2/2015

111

Điều này đã được nâng cao trong v23.0.0 của thư viện AppCompat với việc bổ sung thêm nhiều chủ đề bao gồm

Widget.AppCompat.Button.Colored

Trước hết bao gồm sự phụ thuộc appCompat nếu bạn chưa có

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

ngay bây giờ vì bạn cần sử dụng v23 của compat ứng dụng, bạn cũng sẽ cần nhắm mục tiêu SDK-v23!

    compileSdkVersion = 23
    targetSdkVersion = 23

Trong bạn values/theme

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

Trong bạn values/style

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

Trong bạn 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>

Vì chủ đề nút của bạn dựa trên Widget.AppCompat.Button.Colored Màu văn bản trên nút theo mặc định là màu trắng!

nhưng dường như có một vấn đề khi bạn tắt nút này, nút sẽ thay đổi màu của nó thành màu xám nhạt, nhưng màu văn bản sẽ vẫn là màu trắng!

một cách giải quyết cho vấn đề này là đặc biệt đặt màu văn bản trên nút thành màu trắng! như tôi đã làm theo phong cách hiển thị ở trên.

bây giờ bạn có thể chỉ cần xác định nút của mình và để AppCompat làm phần còn lại :)

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

Nhà nước tàn tật Trạng thái vô hiệu hóa

Nhà nước kích hoạt Nhà nước kích hoạt

Biên tập:

Thêm <Button android:theme="@style/BrandButtonStyle"/>


19
Đó là cách tốt nhất để làm điều đó, ngay bây giờ! Bạn cũng có thể sử dụng kiểu trên các nút riêng lẻ với <Button android:theme="@style/BrandButtonStyle"/>. Nó phải là themethuộc tính và không phảistylethuộc tính.
mohlendo

7
@Muhammad Alfaifi Bạn có dự án mẫu hay ý chính cho việc này không? Tôi đã tạo dự án sạch và nó không hoạt động: github.com/Bresiu/ThemeTest . Trong các màu của nút Lolipop có màu nhấn và trên API v16, nút vẫn có màu xám: i.imgur.com/EVwkpk2.png
Bresiu

4
Điều này chỉ hoạt động với tôi khi chỉ định thuộc tính android: theme. Tôi không thể có được kiểu thuộc tính để làm việc với tôi bằng thẻ nút.
Ray Hunter

8
Sử dụng lib v23.1, điều này không hoạt động chính xác, nó luôn hiển thị màu nhấn là bg, không phải màu được xác định, khi cố gắng đặt nó thành toàn bộ chủ đề
Patrick Favre

3
Vấn đề tương tự ở đây, trên v23.1, nút bị tắt có cùng màu với nút được bật. rất bực bội. bất cứ ai tìm ra điều này?
AhmedW

63

Trong Thư viện hỗ trợ Android 22.1.0, Google đã đưa ra Buttonnhận thức. Vì vậy, một cách khác để tùy chỉnh màu nền của nút là sử dụngbackgroundTint thuộc tính.

Ví dụ,

<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
Cuối cùng! Bài đăng trên blog về phiên bản 22.1: android-developers.blogspot.no/2015/04/ Kẻ
GuillermoMP

5
Tài liệu nói: "Điều này sẽ tự động được sử dụng khi bạn sử dụng Nút trong bố cục của mình. Bạn chỉ cần sử dụng thủ công lớp này khi viết chế độ xem tùy chỉnh." developer.android.com/reference/android/support/v7/widget/ vì điều này có nghĩa là chúng ta không phải thay đổi thủ công tất cả các bố cục và mã java?
Stephane

@Stephane không, chúng ta nên thay đổi bố cục. chris.banes.me/2015/04/22/support-libraries-v22-1-0
Anton Holovin

TUYỆT VỜI! Bây giờ, có AppCompatToggleButton cho phép bạn thay đổi nền của ToggleButtons không? Có lẽ tôi có thể đạo văn mã ...
swooby

19
Thật không may, điều này chỉ hoạt động trên API 21+. Thuộc tính android: backgroundTint không hoạt động trên pre-Lollipop ngay cả với thư viện AppCompat. Chỉ colorButtonN normal từ chủ đề hoạt động trên tiền Lollipop.
Timur_C

42

Để hỗ trợ các nút màu, hãy sử dụng thư viện AppCompat mới nhất (> 23.2.1 ) với:

thổi phồng - XML

Ứng dụng AppCompat:

android.support.v7.widget.AppCompatButton

Phong cách ứng dụng:

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

Lưu ý! Để đặt màu tùy chỉnh trong xml: sử dụng attr: appthay vìandroid

(sử dụng alt+enterhoặc khai báo xmlns:app="http://schemas.android.com/apk/res-auto"để sử dụng app)

ứng dụng : backgroundTint = "@ color / your_custom_color"

Thí dụ:

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

hoặc đặt nó theo chương trình - JAVA

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

Mã Java của bạn đã làm việc cho tôi. Và câu trả lời của Muhammad Alfaifi đã giúp thiết lập màu văn bản của nút.
Micro

Có một cách dễ dàng để lập trình các tông màu (không phải nền)?
hầm

Tuyệt vời! Hoạt động trên 4.4.4 là tốt! Và trạng thái chọn cũng được duy trì khá tốt!
sud007

Theo tài liệu : Điều này được tự động sử dụng khi cài đặt các nút trong bố cục của bạn. Bạn chỉ cần chỉ định AppCompatButton khi tạo chế độ xem tùy chỉnh.
gMale

Điều thú vị là các thay đổi XML hoạt động hoàn hảo trong một đoạn nhưng không phải trong bố cục Hoạt động. Các nút Activity chỉ được sử dụng colorAccent. Các phiên bản lập trình làm việc mặc dù.
Leon

25

Với mới nhất Thư viện hỗ trợ bạn chỉ có thể kế thừa bạn hoạt động từ AppCompatActivity, vì vậy nó sẽ thổi phồng của bạn Buttonnhư AppCompatButtonvà cung cấp cho bạn một cơ hội để màu sắc phong cách của mỗi nút duy nhất trên bố trí với việc sử dụng các android:theme="@style/SomeButtonStyle", nơi SomeButtonStylelà:

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

Làm việc cho tôi trong 2.3.7, 4.4.1, 5.0.2


Cảm ơn!!! Tôi vừa thay đổi giá trị cha mẹ cho "Widget.AppCompat.EditText" vì tôi cần cập nhật kiểu EditText.
Juan Saravia

3
Cảm ơn bạn, làm việc cho tôi là tốt. Hãy chắc chắn để sử dụng android:themevà không style. Bạn cũng có thể thêm colorControlHighlightcolorControlActivated.
Rachel

không hoạt động, API 22, AppCompatActivity, chủ đề Chất liệu
Ánh sáng

1
@AndreyUglev cố gắng sử dụng Theme.AppCompat.Lightthay thế.
Artem

Xin chào, nó thay đổi màu mong muốn NHƯNG loại bỏ bóng.
Amio.io

16

nếu bạn muốn phong cách dưới đây

nhập mô tả hình ảnh ở đây

thêm kiểu này nút của bạn

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

nếu bạn muốn phong cách này

nhập mô tả hình ảnh ở đây

thêm mã dưới đây

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

1
compile 'com.android.support:appcompat-v7:23.1.0'Bạn phải thêm.
Pratik Butani

1
nhưng câu hỏi là làm thế nào để có các nút vật liệu với các màu khác nhau, sao cho không phải tất cả đều có màu chính của chủ đề.
Tông đồ

15

Câu trả lời là theo phong cách THEME

Vấn đề là màu Nút bị dính với màuButtonN normal của chủ đề. Tôi đã cố gắng thay đổi Phong cách theo nhiều cách khác nhau mà không gặp may mắn. Vì vậy, tôi đã thay đổi chủ đề nút .

Tạo một chủ đề với colorButtonN normal và colorPrimary:

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

Sử dụng chủ đề này trong nút

<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" có thể là bất kỳ thứ gì mở rộng Kiểu nút như ở đây tôi sử dụng màu chính cho màu văn bản:

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

Và bạn nhận được nút theo bất kỳ màu nào bạn muốn tương thích với thiết kế vật liệu.


các thuộc tính khác tôi có thể thêm vào phong cách là gì.
Sagar Nayak

4

Tôi vừa tạo một thư viện Android, cho phép bạn dễ dàng sửa đổi màu nút và màu gợn

https://github.com/xgc1986/RípButton

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

Bạn không cần tạo kiểu cho mỗi nút bạn muốn có màu khác nhau, cho phép bạn tùy chỉnh màu ngẫu nhiên


4

công việc này đối với tôi với appcompat-v7: 22.2.0 trong Android + 4.0

trong tệp kiểu của bạn

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

trong tập tin bố trí của bạn

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

Xin chào, nó thay đổi màu mong muốn NHƯNG loại bỏ bóng.
Amio.io

Xin chào lần nữa, tôi có thể thấy. Đó là hành vi đúng đắn bây giờ.
Amio.io

Làm thế nào bạn có thể làm điều này trong Java?
Micro

@MicroR kiểm tra câu trả lời ở trên.
ingyesid

4

Bố trí:

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

kiểu tệp:

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

màu / 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>

màu / button lòng_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

Đối với những người sử dụng ImageButtonở đây là cách bạn làm điều đó:

Trong style.xml:

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

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

Sau đó, trong tập tin bố trí của bạn:

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

Điều này đã giúp .... Tôi đoán điều quan trọng cần lưu ý là áp dụng kiểu nút làm chủ đề thay vì kiểu trong tiện ích Nút. Tôi đã áp dụng nó theo style = "@ style / BlueImageButton" và nó không hoạt động
vận tốc

3

Nếu bạn sử dụng giải pháp kiểu với colorButtonN normal , đừng quên kế thừa từ Widget.AppCompat.Button.Colored để hiệu ứng gợn hoạt động;)

Giống

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

2

Một giải pháp đơn giản khác sử dụng AppCompatButton

<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

Sử dụng:

android:backgroundTint="@color/customColor"

Hoặc thậm chí:

android:background="@color/customColor"

và điều đó sẽ cung cấp màu tùy chỉnh cho nút.


1

Nếu bạn chỉ muốn nút vật liệu "phẳng", bạn có thể tùy chỉnh nền của chúng bằng cách sử dụng thuộc tính selectableItemBackground như được giải thích ở đây .


Nếu bạn không muốn thay đổi bất kỳ màu "tint" hoặc màu đã chọn nào, đây chắc chắn là một giải pháp dễ dàng để vẫn nhận được phản hồi với các nút màu. Cảm ơn!
theblang

1

Để thay đổi màu của một nút duy nhất

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

1

Đối với tôi, vấn đề là trong Android 5.0 android:colorButtonNormalkhông có tác dụng, và thực tế, không có mục nào từ chủ đề (như android:colorAccent), nhưng trong Android 4.4.3, chẳng hạn, đã làm. Dự án được cấu hình với compileSdkVersiontargetSdkVersionđến 22, vì vậy tôi đã thực hiện tất cả các thay đổi khi @Muhammad Alfaifi sugessted, nhưng cuối cùng, tôi nhận thấy rằng vấn đề là buildToolsVersion , đã được cập nhật. Khi tôi thay đổi thành 23.0.1 , mọi thứ bắt đầu hoạt động gần như bình thường. Bây giờ, android:colorButtonNormalvẫn không có tác dụng, nhưng ít nhất nút này phản ứng vớiandroid:colorAccent , điều này đối với tôi là chấp nhận được.

Tôi hy vọng rằng gợi ý này có thể giúp đỡ một ai đó. Lưu ý: Tôi đã áp dụng kiểu trực tiếp cho nút, vì nút này android:theme=[...]cũng không có hiệu lực.


Bạn gần như đã tìm thấy cách chính xác 100% về cách sử dụng @ style / Widget mới .ppCompat.Button.Colored;) - xem câu trả lời này stackoverflow.com/a353811157/19733911
nằm trong

1

Một cách để loại bỏ điều này cho phép bạn chỉ trỏ đến một kiểu và KHÔNG chủ đề TẤT CẢ các nút trong ứng dụng của bạn giống nhau.
Trong Themes.xml thêm một chủ đề

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

Bây giờ trong tệp kiểu tệp thêm

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

Bây giờ trong bố cục của bạn chỉ cần trỏ vào PHONG CÁCH trong Nút của bạn

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

1

CẬP NHẬT

Sử dụng thư viện hỗ trợ thiết kế (23.2.0)appcompatwidgets như dưới đây

Trong Thư viện hỗ trợ Android 22.1 :

Điều này được thực hiện tự động khi tăng bố cục - thay thế Nút bằng AppCompatButton, TextView bằng AppCompatTextView, v.v. để đảm bảo rằng mỗi cái có thể hỗ trợ pha màu. Trong bản phát hành này, các tiện ích nhận biết màu này hiện có sẵn công khai, cho phép bạn tiếp tục hỗ trợ pha màu ngay cả khi bạn cần phân lớp một trong các tiện ích được hỗ trợ.

Danh sách đầy đủ các tiện ích nhận biết màu:

AppCompatAutoCompleteTextView
AppCompatButton
AppCompatCheckBox
AppCompatCheckedTextView
AppCompatEditText
AppCompatMultiAutoCompleteTextView
AppCompatRadioButton
AppCompatRatingBar
AppCompatSpinner
AppCompatTextView

Thiết kế vật liệu cho các thiết bị Pre-Lollipop :

AppCompat (còn gọi là ActionBarCompat) khởi đầu là một backport của API ActionBar Android 4.0 cho các thiết bị chạy trên Gingerbread, cung cấp một lớp API phổ biến trên đầu trang của việc triển khai backport và triển khai khung. AppCompat v21 cung cấp API và bộ tính năng được cập nhật với Android 5.0



1

Nếu bạn muốn sử dụng kiểu AppCompat như Widget.AppCompat.Button , Base.Widget.AppCompat.Button.Colored , v.v., bạn cần sử dụng các kiểu này với các khung nhìn tương thích từ thư viện hỗ trợ.

Mã dưới đây không hoạt động cho các thiết bị pre-lolipop:

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

Bạn cần sử dụng AppCompatButton để bật các kiểu AppCompat:

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

2
Các tiện ích compat ứng dụng không được sử dụng tự động khi tăng bố cục XML? Tôi tin rằng ImageViewđược thay thế bằng AppCompatImageViewvà nó sẽ giống với tất cả các vật dụng, có AppCompatphiên bản tương ứng .
d.aemon

Không, nếu bạn không nhắm mục tiêu phiên bản mục tiêu cuối cùng, bạn cần xác định android.support.v7.widget.AppCompatImageViewrõ ràng.
farukcankaya

Bạn có ý nghĩa gì bởi last target version, @power?
d.aemon

1

Tôi sử dụng cái này Hiệu ứng gợn và nút bấm bóng làm việc.

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>

Nút trên bố trí:

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

0

Tôi thực sự không muốn thay đổi kiểu nút tùy chỉnh của mình nhưng tiếc là chúng không hoạt động nữa.

Ứng dụng của tôi có minSdkVersion là 9 và mọi thứ đều hoạt động trước đó.

Tôi không biết tại sao nhưng vì tôi đã gỡ bỏ Android: trước nútStyle, nó dường như hoạt động trở lại

bây giờ = làm việc:

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

trước = chỉ các nút vật liệu màu xám:

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

Tôi không có thư mục spezial cho phiên bản Android mới vì các nút của tôi khá bằng phẳng và chúng sẽ trông giống nhau trên tất cả các phiên bản Android.

Có lẽ ai đó có thể cho tôi biết lý do tại sao tôi phải xóa "android:" ImageButton vẫn hoạt động với "android:"

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

0

Sau 2 ngày tìm kiếm câu trả lời, nút theo chủ đề không hoạt động với tôi trong API <21.

Giải pháp duy nhất của tôi là ghi đè AppCompatButton pha màu không chỉ với chủ đề ứng dụng cơ bản "colorButtonN normal" mà còn xem nềnTint như thế này:

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

Sau đó, bạn có thể xác định màu Nút như thế này:

<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

Câu trả lời SO này đã giúp tôi đi đến câu trả lời https://stackoverflow.com/a/30277424/3075340

Tôi sử dụng phương pháp tiện ích này để đặt màu nền của một nút. Nó hoạt động với các thiết bị tiền kẹo mút:

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

}

Cách sử dụng trong mã:

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

Bằng cách này, bạn không phải chỉ định ColorStateList nếu bạn chỉ muốn thay đổi tông màu nền và không có gì khác ngoài việc duy trì các hiệu ứng nút đẹp và những gì không.


0

Tôi đặt android:textColorđể @nulltrong chủ đề nút của tôi và nó giúp.

kiểu tệp

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

Bây giờ màu văn bản nút được colorAccentxác định trongAppTheme

<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

nếu bạn sử dụng kotlin, bạn có thể thấy Tất cả các thuộc tính từ MaterialButton được hỗ trợ. Không sử dụng thuộc tính android: nền. MaterialButton quản lý nền có thể vẽ của riêng mình và đặt nền mới có nghĩa là màu vật liệu bị vô hiệu hóa không thể đảm bảo rằng các thuộc tính mới mà nó giới thiệu sẽ hoạt động bình thường. Nếu nền mặc định được thay đổi, Nút Vật liệu không thể đảm bảo hành vi được xác định rõ. Tại MainActivity.kt

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

Tại Activity_main.xml

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

tài nguyên: Ví dụ thay đổi màu vật liệu


0

Nếu bạn muốn làm điều này thông qua mã bằng bất kỳ màu nào, hãy sử dụng:

DrawableCompat.setTintList(button.getBackground(), ColorStateList.valueOf(yourColor));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.