Làm thế nào để tô xám một nút?


103

Tôi có một nút được xác định như hình dưới đây. Khi tôi muốn vô hiệu hóa nó my_btn.setEnabled(false), tôi sẽ sử dụng , nhưng tôi cũng muốn chuyển sang màu xám. Làm thế nào tôi có thể làm điều đó?

Cảm ơn

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

style / srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

drawable / btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>

Câu trả lời:


57

Bạn phải cung cấp 3 hoặc 4 trạng thái trong btn_defaut.xmlbộ chọn của bạn .

  1. Trạng thái ép
  2. Trạng thái mặc định
  3. Tiêu điểm trạng thái
  4. Trạng thái đã bật (Tắt trạng thái có chỉ báo sai; xem nhận xét)

Bạn sẽ cung cấp hiệu ứng và nền cho các trạng thái tương ứng.

Đây là một cuộc thảo luận chi tiết: Nút Android tiêu chuẩn với một màu khác


Vì vậy, để nó chuyển sang màu xám, tôi phải thay đổi màu của nền VÀ màu của văn bản ở trạng thái tắt? Không có cách nào để chỉ thêm một tiền cảnh trong suốt?
jul

3
Vâng! những gì bạn sẽ cung cấp cho android:state_disable="true"nó sẽ hiển thị trạng thái khi Nút bị tắt, cách dễ dàng và được khuyến nghị.
Adil Soomro

và tôi có thể chỉ định màu văn bản cho trạng thái bị vô hiệu ở đâu? Có vẻ như chỉ có một nền mới có thể được chỉ định ... Tôi đã hỏi một câu hỏi mới cho điều đó: stackoverflow.com/questions/8743584/…
jul

17
Không có android:state_disable="true", có không? Bạn đang đề cập đến android:state_enabled="false"?
caw

@MarcoW: vâng bạn hoàn toàn chính xác. Xin lỗi vì thuộc tính sai.
Adil Soomro

171

Bạn cũng có thể làm cho nó xuất hiện dưới dạng vô hiệu hóa bằng cách đặt alpha (làm cho nó nửa trong suốt). Điều này đặc biệt hữu ích nếu nền nút của bạn là một hình ảnh và bạn không muốn tạo trạng thái cho nó.

button.setAlpha(.5f);
button.setClickable(false);

cập nhật: Tôi đã viết giải pháp trên trước Kotlin và khi tôi còn là một tân binh. Đó là một giải pháp "nhanh chóng" hơn, nhưng tôi không khuyến khích nó trong một môi trường chuyên nghiệp.

Hôm nay, nếu tôi muốn một giải pháp chung hoạt động trên bất kỳ nút / chế độ xem nào mà không cần phải tạo danh sách trạng thái, tôi sẽ tạo một tiện ích mở rộng Kotlin.

fun View.disable() {
    getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
    setClickable(false)
}

Trong Java, bạn có thể làm điều gì đó tương tự với một hàm sử dụng tĩnh và bạn chỉ cần chuyển vào dạng xem dưới dạng biến. Nó không sạch nhưng nó hoạt động.


4
Tôi đã đọc rằng các cuộc gọi đến setAlpha rất tốn kém trên CPU. Bất cứ ai có thể xác nhận?
Ali Kazi

@AliKazi nó phụ thuộc vào loại của bạn View. Từ bài đăng trên G + này : "Nếu Chế độ xem của bạn không chứa các lệnh vẽ chồng chéo, setAlpha()được tối ưu hóa và chúng tôi chỉ cần sửa đổi các đối tượng Paint để áp dụng alpha thích hợp. Điều này xảy ra khi View.hasOverlappingRendering()trả về true. Các ImageViews và TextViews không có nền có thể vẽ là các ứng cử viên phổ biến cho điều này tối ưu hóa. Nếu bạn đang ở trong tình huống này, hãy sử dụng setAlpha()bao nhiêu tùy thích. ".
Sufian

1
@Sufian Cảm ơn. Nhưng để an toàn hơn, tôi đã dựa vào StateListDrawable đơn giản cho mỗi nút. Làm thế nào tôi đã làm điều đó, tôi đã đăng như một câu trả lời mới. Tôi đã bao gồm các liên kết đến nơi tôi biết được rằng alpha không tốt cho hiệu suất.
Ali Kazi

Nhìn bề ngoài người dùng thân thiện
Farid

mà thực sự vô hiệu hóa chế độ xem. nhờ @Siavash
Akash Bisariya

54

Giải pháp dễ dàng nhất là đặt bộ lọc màu thành hình nền của nút như tôi đã thấy ở đây

Bạn có thể làm như sau:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

Hy vọng tôi đã giúp ai đó ...


Tôi thích cách tiếp cận này nhất. Cảm ơn!
nab

2
Cách tiếp cận này có tiềm năng, nhưng màu sắc kết quả không phải lúc nào cũng như bạn nghĩ. Ví dụ: một nút Cam với màu Xám được nhân lên sẽ tạo ra màu đỏ đậm - không phải màu cam nhạt.
Ai đó ở đâu đó

4
có lẽ Mode.SRC_INnên được sử dụng thay vì Multiply. Xem stackoverflow.com/a/17112876/550471
Ai đó ở đâu đó vào

Công trình này, nhưng hai màu sắc khi lần lượt hỗn hợp thành màu khác
Shamsul Arefin Sajib

Tuyệt vời! thật sạch sẽ.
Milind Chaudhary

21

Tất cả các câu trả lời đưa ra đều hoạt động tốt, nhưng tôi nhớ rằng việc sử dụng setAlpha có thể là một ý tưởng tồi để thực hiện một cách khôn ngoan (thông tin thêm tại đây ). Vì vậy, tạo StateListDrawable là một ý tưởng tốt hơn để quản lý trạng thái bị vô hiệu hóa của các nút. Đây là cách thực hiện:

Tạo một btn_blue.xml XML trong thư mục res / drawable:

<!-- Disable background -->
<item android:state_enabled="false"
      android:color="@color/md_blue_200"/>

<!-- Enabled background -->
<item android:color="@color/md_blue_500"/>

Tạo kiểu nút trong res / values ​​/ styles.xml

<style name="BlueButton" parent="ThemeOverlay.AppCompat">
      <item name="colorButtonNormal">@drawable/btn_blue</item>
      <item name="android:textColor">@color/md_white_1000</item>
</style>

Sau đó, áp dụng kiểu này cho nút của bạn:

<Button
     android:id="@+id/my_disabled_button"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/BlueButton"/>

Bây giờ khi bạn gọi btnBlue.setEnabled(true)HOẶC, btnBlue.setEnabled(false)các màu trạng thái sẽ tự động chuyển đổi.


12

Đặt Clickable là false và thay đổi màu backgroung thành:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));

12

Bạn nên tạo tệp XML cho nút bị tắt ( drawable / btn_disable.xml )

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/grey" />
    <corners android:radius="6dp" />
</shape>

Và tạo bộ chọn cho nút ( drawable / btn_selector.xml )

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/>
    <item android:drawable="@drawable/btn_default" android:state_enabled="true"/>
    <item android:drawable="@drawable/btn_default" android:state_pressed="false" />

</selector>

Thêm bộ chọn vào nút của bạn

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>


1

Tôi đã sử dụng mã này cho điều đó:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);

0

Tôi đã thử các giải pháp trên nhưng không có giải pháp nào trong số chúng dường như hiệu quả với tôi. Tôi đã đi với tùy chọn sau:

<!-- button_color_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_enabled="true"/>
    <item android:color="@color/colorAccentLight" android:state_enabled="false"/>
</selector>
<com.google.android.material.button.MaterialButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:backgroundTint="@color/button_color_selector"
                .../>
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.