จะทำให้ปุ่มเป็นสีเทาได้อย่างไร?


103

ฉันมีปุ่มที่กำหนดไว้ตามที่แสดงด้านล่าง เมื่อฉันต้องการปิดการใช้งานฉันใช้my_btn.setEnabled(false)แต่ฉันก็ต้องการให้มันเป็นสีเทาด้วย ฉันจะทำเช่นนั้นได้อย่างไร?

ขอบคุณ

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

คำตอบ:


57

คุณต้องระบุ 3 หรือ 4 สถานะในbtn_defaut.xmlฐานะตัวเลือกของคุณ

  1. สถานะกด
  2. สถานะเริ่มต้น
  3. สถานะโฟกัส
  4. สถานะที่เปิดใช้งาน (สถานะปิดใช้งานด้วยการบ่งชี้เท็จดูความคิดเห็น)

คุณจะให้เอฟเฟกต์และความเป็นมาของรัฐตามนั้น

นี่คือการอภิปรายโดยละเอียด: ปุ่ม Android มาตรฐานที่มีสีอื่น


ดังนั้นเพื่อให้เป็นสีเทาฉันต้องเปลี่ยนสีของพื้นหลังและสีของข้อความในสถานะปิดใช้งาน? ไม่มีวิธีใดที่จะเพิ่มพื้นหน้าโปร่งใสเท่านั้น?
กรกฎาคม

3
ใช่! สิ่งที่คุณจะให้android:state_disable="true"มันจะแสดงสถานะเมื่อปุ่มถูกปิดใช้งานวิธีที่ง่ายและแนะนำ
Adil Soomro

และจะระบุสีข้อความสำหรับสถานะปิดใช้งานได้ที่ไหน ดูเหมือนว่ามีเพียงพื้นหลังสามารถระบุได้ ... ฉันถามคำถามใหม่ว่า: stackoverflow.com/questions/8743584/...
กรกฎาคม

17
ไม่มีandroid:state_disable="true"มีไหม? คุณหมายถึงandroid:state_enabled="false"?
วัว

@MarcoW: ใช่คุณถูกต้อง ขออภัยสำหรับแอตทริบิวต์ที่ไม่ถูกต้อง
Adil Soomro

172

คุณยังสามารถทำให้มันปรากฏเป็นปิดใช้งานได้โดยการตั้งค่าอัลฟา (ทำให้เป็นแบบกึ่งโปร่งใส) สิ่งนี้มีประโยชน์อย่างยิ่งหากพื้นหลังของปุ่มของคุณเป็นรูปภาพและคุณไม่ต้องการสร้างสถานะสำหรับมัน

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

อัปเดต:ฉันเขียนวิธีแก้ปัญหาข้างต้นก่อน Kotlin และตอนที่ฉันยังเป็นมือใหม่ มันเป็นวิธีแก้ปัญหาที่ "รวดเร็วสกปรก" มากกว่า แต่ฉันไม่แนะนำให้ใช้ในสภาพแวดล้อมแบบมืออาชีพ

วันนี้ถ้าฉันต้องการโซลูชันทั่วไปที่ใช้งานได้กับปุ่ม / มุมมองใด ๆ โดยไม่ต้องสร้างรายการสถานะฉันจะสร้างส่วนขยาย Kotlin

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

ใน Java คุณสามารถทำบางสิ่งที่คล้ายกันกับฟังก์ชัน util แบบคงที่และคุณจะต้องส่งผ่านมุมมองเป็นตัวแปร มันไม่สะอาดเท่า แต่ใช้งานได้


4
ฉันเคยอ่านมาว่าการโทรไป setAlpha มีราคาแพงสำหรับ CPU มีใครยืนยันได้ไหม
Ali Kazi

@AliKazi ขึ้นอยู่กับประเภทของViewไฟล์. จากการโพสต์ G + : "ถ้าคุณดูไม่ได้มีการทับซ้อนกันคำสั่งการวาดภาพ, setAlpha()การเพิ่มประสิทธิภาพออกไปและเราก็ปรับเปลี่ยนสีวัตถุที่จะใช้อัลฟาที่เหมาะสมนี้เกิดขึ้นเมื่อ. View.hasOverlappingRendering()ผลตอบแทนที่แท้จริง. ImageViewและTextViewS กับไม่มี drawable พื้นหลังมีผู้สมัครที่พบบ่อยสำหรับการนี้ การเพิ่มประสิทธิภาพหากคุณตกอยู่ในสถานการณ์นี้ให้ใช้setAlpha()เท่าที่คุณต้องการ ".
Sufian

1
@Sufian ขอบคุณ แต่เพื่อให้ปลอดภัยยิ่งขึ้นฉันอาศัย StateListDrawable แบบง่ายสำหรับแต่ละปุ่ม ฉันทำอย่างไรฉันได้โพสต์เป็นคำตอบใหม่ ฉันได้รวมลิงก์ไปยังที่ที่ฉันได้เรียนรู้ว่าอัลฟาไม่ดีต่อประสิทธิภาพ
Ali Kazi

สายตาไม่เป็นมิตรกับผู้ใช้
Farid

ที่ปิดการใช้งานมุมมองจริง ขอบคุณ @Siavash
Akash Bisariya

54

วิธีแก้ปัญหาที่ง่ายที่สุดคือการตั้งค่าฟิลเตอร์สีเป็นภาพพื้นหลังของปุ่มอย่างที่ฉันเห็นที่นี่

คุณสามารถทำได้ดังนี้

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

หวังว่าฉันจะช่วยใครสักคน ...


ฉันชอบแนวทางนี้ที่สุด ขอบคุณ!
จับ

2
แนวทางนี้มีความเป็นไปได้ แต่สีที่ได้นั้นไม่ได้เป็นอย่างที่คุณคิดเสมอไป ตัวอย่างเช่นปุ่มสีส้มที่มีสีเทาคูณจะได้สีแดงเข้มไม่ใช่สีส้มจาง
ใครบางคนใน

4
อาจMode.SRC_INจะใช้แทน Multiply ดูstackoverflow.com/a/17112876/550471
ใครสักคน

ใช้งานได้ แต่สองสีเมื่อผสมกันกลายเป็นสีอื่น
Shamsul Arefin Sajib

สุดยอด! สะอาดมาก
Milind Chaudhary

21

คำตอบที่ได้รับทั้งหมดทำงานได้ดี แต่ฉันจำได้ว่าการเรียนรู้ว่าการใช้ setAlpha อาจเป็นแนวคิดที่ไม่ดีอย่างชาญฉลาด (ข้อมูลเพิ่มเติมที่นี่ ) ดังนั้นการสร้างStateListDrawableจึงเป็นความคิดที่ดีกว่าในการจัดการสถานะปิดใช้งานของปุ่ม วิธีการมีดังนี้

สร้าง XML btn_blue.xml ในโฟลเดอร์ res / drawable:

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

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

สร้างสไตล์ปุ่มใน 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>

จากนั้นใช้สไตล์นี้กับปุ่มของคุณ:

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

ตอนนี้เมื่อคุณโทรbtnBlue.setEnabled(true)หรือbtnBlue.setEnabled(false)สีของรัฐจะเปลี่ยนโดยอัตโนมัติ


12

ตั้งค่า Clickable เป็นเท็จและเปลี่ยนสีพื้นหลังเป็น:

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

12

คุณควรสร้างไฟล์ XML สำหรับปุ่มปิดใช้งาน ( drawable / btn_disable.xml )

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

และสร้างตัวเลือกสำหรับปุ่ม ( 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>

เพิ่มตัวเลือกลงในปุ่มของคุณ

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


1

ฉันใช้รหัสนี้เพื่อสิ่งนั้น:

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

0

ฉันลองใช้วิธีแก้ปัญหาข้างต้นแล้ว แต่ดูเหมือนจะไม่ได้ผลสำหรับฉัน ฉันใช้ตัวเลือกต่อไปนี้:

<!-- 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"
                .../>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.