एक बटन को ग्रे कैसे करें?


103

मेरे पास एक बटन है जिसे नीचे दिखाया गया है। जब मैं इसे निष्क्रिय करना चाहता हूं तो मैं इसका उपयोग करता हूं my_btn.setEnabled(false), लेकिन मैं इसे ग्रे करना चाहूंगा। मैं उसे कैसे कर सकता हूँ?

धन्यवाद

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

शैली / 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

आपको अपने btn_defaut.xmlचयनकर्ता के रूप में 3 या 4 राज्य प्रदान करने होंगे ।

  1. दबाया हुआ राज्य
  2. डिफ़ॉल्ट स्थिति
  3. फोकस स्थिति
  4. सक्षम स्थिति (झूठे संकेत के साथ अक्षम स्थिति; टिप्पणियों को देखें)

आप तदनुसार राज्यों के लिए प्रभाव और पृष्ठभूमि प्रदान करेंगे।

यहां एक विस्तृत चर्चा है: एक अलग रंग के साथ मानक एंड्रॉइड बटन


तो इसे धूसर करने के लिए, मुझे अक्षम अवस्था में पृष्ठभूमि का रंग और पाठ का रंग बदलना होगा? सिर्फ एक पारदर्शी अग्रभूमि जोड़ने का कोई तरीका नहीं है?
जूल

3
हाँ! जब आप इसके लिए प्रदान android:state_disable="true"करेंगे, तो बटन निष्क्रिय होने पर राज्य को दिखाएगा, आसान और अनुशंसित तरीका।
आदिल सूमो

और मैं विकलांग राज्य के लिए पाठ का रंग कहां निर्दिष्ट कर सकता हूं? ऐसा लगता है कि केवल एक पृष्ठभूमि निर्दिष्ट की जा सकती है ... मैंने उसके लिए एक नया प्रश्न पूछा: stackoverflow.com/questions/8743584/…
jul

17
कोई है android:state_disable="true", है वहाँ? क्या आप जिक्र कर रहे हैं android:state_enabled="false"?
caw

@ मर्कोव .: हाँ आप बिल्कुल सही हैं। गलत विशेषता के लिए क्षमा याचना।
आदिल सूमरो

172

आप अल्फा को सेट करके (इसे अर्ध-पारदर्शी बनाते हुए) अक्षम कर सकते हैं। यह विशेष रूप से उपयोगी है यदि आपकी बटन पृष्ठभूमि एक छवि है, और आप इसके लिए राज्य नहीं बनाना चाहते हैं।

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

अद्यतन: मैंने उपरोक्त समाधान पूर्व कोटलिन लिखा था और जब मैं एक धोखेबाज़ था। यह एक "quick'n'dirty" समाधान से अधिक है, लेकिन मैं इसे पेशेवर वातावरण में अनुशंसित नहीं करता हूं।

आज, अगर मैं एक जेनेरिक समाधान चाहता था जो किसी भी बटन / दृश्य पर काम करता है, तो राज्य सूची बनाने के बिना, मैं एक कोटलिन एक्सटेंशन बनाऊंगा।

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

जावा में आप कुछ कर सकते हैं एक स्थैतिक उपयोग फ़ंक्शन के साथ समान है और आपको बस चर के रूप में दृश्य में पास करना होगा। यह उतना साफ नहीं है, लेकिन यह काम करता है।


4
मैंने पढ़ा था कि CPU पर setAlpha महंगे हैं। क्या कोई पुष्टि कर सकता है?
अली काजी

@ अलीकी यह आपके प्रकार पर निर्भर करता है View। से इस जी + पोस्ट : "अपने दृश्य ड्राइंग आदेशों का ओवरलैप हो नहीं है, तो setAlpha()दूर अनुकूलित है और हम बस पेंट उचित अल्फा लागू करने के लिए वस्तुओं को संशोधित यह तब होता है जब। View.hasOverlappingRendering()रिटर्न सही। ImageViewऔर TextViewकोई पृष्ठभूमि drawable के साथ है कर रहे हैं इस के लिए आम उम्मीदवारों अनुकूलन। यदि आप इस स्थिति में हैं, तो setAlpha()जितना चाहें उतना उपयोग करें । "
सूफियान

1
@ सूफियान धन्यवाद लेकिन एक सुरक्षित पक्ष पर होने के लिए, मैं प्रत्येक बटन के लिए एक साधारण स्टेटलिस्ट पर निर्भर था। मैंने ऐसा कैसे किया, मैंने एक नए उत्तर के रूप में पोस्ट किया है। मैंने उन लिंक को शामिल किया है जहां मैंने सीखा है कि प्रदर्शन के लिए अल्फा खराब है।
अली काजी

नेत्रहीन उपयोगकर्ता-अप्राप्य
फरीद

यह वास्तव में दृष्टि को निष्क्रिय कर देता है। धन्यवाद @ सियावश
आकाश

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कि इसका इस्तेमाल मल्टीप्ली के बजाय किया जाए। देखें stackoverflow.com/a/17112876/550471
किसी ने

यह काम करता है, लेकिन दो रंग जब मिश्रित होते हैं तो दूसरे रंग में बदल जाते हैं
शम्सुल आरफिन साजिब

बहुत बढ़िया! इतना साफ।
मिलिंद चौधरी

21

सभी दिए गए उत्तर ठीक काम करते हैं, लेकिन मुझे याद है कि सेटालफा का उपयोग करना एक बुरा विचार प्रदर्शन बुद्धिमान (अधिक जानकारी यहाँ ) हो सकता है। इसलिए बटन की अक्षम स्थिति को प्रबंधित करने के लिए एक StateListDrawable बनाना एक बेहतर विचार है। ऐसे:

Res / drawable फ़ोल्डर में XML btn_blue.xml बनाएँ:

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

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

रेस / मान / स्टाइल.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

क्लिक करने योग्य को गलत के रूप में सेट करें और बैकग्रॉन्ग रंग को इस प्रकार बदलें:

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"
                .../>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.