AppTpat v7 के साथ EditText बॉटम लाइन कलर को बदलना


310

मैं Android 5 और इससे कम के लुक को लगातार पाने के लिए appcompat v7 का उपयोग कर रहा हूं। यह अच्छी तरह से काम करता है। हालाँकि मैं यह पता नहीं लगा सकता कि एडिटेक्स के लिए नीचे की रेखा का रंग और लहजे का रंग कैसे बदला जाए। क्या यह संभव है?

मैंने एक रिवाज android:editTextStyle(नीचे cf.) को परिभाषित करने की कोशिश की है, लेकिन मैं केवल पूर्ण पृष्ठभूमि रंग या पाठ रंग को बदलने में सफल रहा, लेकिन न तो नीचे की रेखा और न ही उच्चारण रंग। क्या उपयोग करने के लिए एक विशिष्ट संपत्ति मूल्य है? क्या मुझे android:backgroundसंपत्ति के माध्यम से एक कस्टम ड्रॉ करने योग्य छवि का उपयोग करना होगा ? क्या हेक्सा में रंग निर्दिष्ट करना संभव नहीं है?

 <style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
     <item name="android:editTextStyle">@style/Widget.App.EditText</item>
 </style>

 <style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
     ???
 </style>

Android API 21 स्रोतों के अनुसार, सामग्री डिज़ाइन के साथ EditTexts का उपयोग करना प्रतीत होता है colorControlActivatedऔर colorControlNormal। इसलिए, मैंने पिछली शैली की परिभाषा में इन गुणों को ओवरराइड करने की कोशिश की है लेकिन इसका कोई प्रभाव नहीं है। संभवत: एपकॉम इसका उपयोग नहीं करता है। दुर्भाग्य से, मैं सामग्री डिजाइन के साथ appcompat के अंतिम संस्करण के लिए स्रोत नहीं ढूँढ सकता।


संपादित पाठ के लिए अपनी थीम को परिभाषित करें
मीनल

आपके सुझाव के लिए धन्यवाद लेकिन मैं पहले ही ऐसा कर चुका हूं। मैंने अपना प्रश्न अपडेट कर दिखाया है कि मैंने क्या करने की कोशिश की है। मेरा मुद्दा एडिटेक्स बॉटम लाइन कलर को बदलने के लिए थीम स्टाइल में उपयोग करने की विशेषता के बारे में है। आदर्श रूप से, मैं एक ऐसे समाधान की तलाश में हूं जहां मैं सीधे हेक्सा में रंग निर्दिष्ट कर सकता हूं।
लॉरेंट

इनमें से कोई भी जवाब मेरे लिए 4.3 पर काम नहीं कर रहा है। क्या आपके पास काम करने का हल है?
रॉबर्ट बेकर

मुझे विस्तार करना पड़ा AppCompatEditText, जाहिरा तौर पर।
एपीकपांडाफॉर्स

जवाबों:


479

अंत में, मुझे एक समाधान मिल गया है। यह बस के लिए मूल्य अधिभावी के होते हैं colorControlActivated, colorControlHighlightऔर colorControlNormalअपने edittext शैली अपने अनुप्रयोग विषय परिभाषा और नहीं। फिर, इस विषय का उपयोग करने के लिए सोचें कि आप जो भी गतिविधि चाहते हैं। नीचे एक उदाहरण है:

<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">#c5c5c5</item>
    <item name="colorControlActivated">@color/accent</item>
    <item name="colorControlHighlight">@color/accent</item>
</style>

9
मुझे मेनू हैमबर्गर, बैक बटन और स्क्रॉल बार का रंग बदलकर कलरकंट्रोलनॉर्मल हो गया है।
एरियो

11
यह नीचे की रेखा के रंग को बदल देता है लेकिन यह चेक बॉक्स, रेडियो बटन आदि जैसे हर दूसरे नियंत्रण को भी बदल देता है। यह संपूर्ण अनुप्रयोग / गतिविधि में प्रत्येक EditText को भी बदल देता है। यदि आप किसी एकल EditText की निचली पंक्ति को बदलना चाहते हैं (जैसे मैं करता हूं) तो आपको उस EditText की Android: पृष्ठभूमि संपत्ति को ओवरराइड करना होगा। AFAIK का कोई दूसरा तरीका नहीं है।
इमानुएल मोएक्लिन

68
यदि आप AppCompat v22 समर्थन पुस्तकालय का उपयोग कर रहे हैं, तो आप EditText में विषय को निर्दिष्ट कर सकते हैं जैसे android:theme="@style/Theme.App.Base:। यह सुनिश्चित करेगा कि शैली आपके लेआउट में अन्य विचारों को भी प्रभावित नहीं करेगी जिन्हें आप बदलना नहीं चाहते हैं।
एलेक्स लॉकवुड

8
जेली बीन (4.2) पर काम नहीं किया, लेकिन लॉलीपॉप पर काम किया
मंगेश

3
गतिविधि को इनहेरिट करना चाहिए AppCompatActivity। इससे विरासत में मिला तो काम नहीं होगा Activity
भरतवाज

187

मैंने महसूस किया कि इस मामले में किसी को जवाब देने की जरूरत है क्योंकि कोई व्यक्ति केवल एक संपादन को बदलना चाहता है। मैं इसे इस तरह से करता हूं:

editText.getBackground().mutate().setColorFilter(ContextCompat.getColor(context, R.color.your_color), PorterDuff.Mode.SRC_ATOP);

1
लेकिन मैं डिफ़ॉल्ट पृष्ठभूमि पर कैसे रीसेट कर सकता हूं, मैंने EditText.getBackground ()। ResetColorFilter () लॉलीपॉप पर कॉल करने के बाद बहुत सारे कीड़े पाए हैं?
अल्ट्रा जू

सावधान! इसे जोड़ने से सभी एप्लिकेशन में EditText का रंग बदल सकता है। नेक्सस 5. ओएस 6.0.1 पर परीक्षण किया गया।
एलेक्स पेरेवोझीकोव

1
@AlexPerevozchykov आप सही हो सकते हैं। .GetBackground () के बाद .mutate () जोड़ने का प्रयास करें। इससे हो जाना चाहिए।
hordurh

@ होर्धुर हां, यह था, मुझे यह सुझाव पहले से थोड़ा सा मिल गया है, ड्रॉबल्स एक पूल को साझा करते हैं ताकि बदलने से पहले हमें इसे म्यूट करने की आवश्यकता हो
एलेक्स पेरेवोच्च्कोव

1
अगर मैं edittext का उपयोग करता हूं, तो यह काम करता है, लेकिन लॉलीपॉप पर यह एप्लिकेशन कंपैटिबल edittext के साथ काम नहीं करता है। क्या आप जानते हैं कि मैं इस मुद्दे को कैसे हल कर सकता हूं?
सेलिन

145

जबकि Laurents समाधान सही है, तो यह कुछ कमियां न केवल का लब्बोलुआब के बाद से टिप्पणी में वर्णित के रूप में के साथ आता है EditTextरंगा हुआ हो जाता है, लेकिन के बैक बटन Toolbar, CheckBoxesआदि के रूप में अच्छी तरह से।

सौभाग्य v22.1से appcompat-v7कुछ नई संभावनाओं की शुरुआत की। अब केवल एक दृश्य के लिए एक विशिष्ट विषय निर्दिष्ट करना संभव है। से सीधे चैंज :

अनुप्रयोग का पदावनत उपयोग: स्टाइल टूलबार के लिए थीम। अब आप Android का उपयोग कर सकते हैं : सभी एपीआई स्तर 7 और उच्चतर उपकरणों पर टूलबार के लिए थीम और एपीआई स्तर 11 और उच्चतर उपकरणों पर सभी विजेट के लिए थीम समर्थन ।

इसलिए एक वैश्विक विषय में वांछित रंग सेट करने के बजाय, हम एक नया बनाते हैं और केवल इसे असाइन करते हैं EditText

उदाहरण:

<style name="MyEditTextTheme">
    <!-- Used for the bottom line when not selected / focused -->
    <item name="colorControlNormal">#9e9e9e</item>
    <!-- colorControlActivated & colorControlHighlight use the colorAccent color by default -->
</style>

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/MyEditTextTheme"/>

1
मुझे नहीं लगता कि यह आवश्यक है। colorControlNormalबिना एंड्रॉइड उपसर्ग के एपकंपेट विधि का उपयोग विगेट्स को टिंट करने के लिए किया जाता है, जबकि उपसर्ग के साथ यह सिस्टम विधि में आता है और यह केवल एपीआई 21+ उपकरणों में उपलब्ध है।
पुन: लिखें

हम्म, मैंने अपने लॉलीपॉप डिवाइस पर परीक्षण किया और जब तक आप इसे एंड्रॉइड नेमस्पेस के साथ v21 शैलियों में लागू नहीं करते, तब तक यह कस्टम रंग के लिए अभ्यस्त हो जाएगा।
user2968401

मैं 22.2.0
AppCompat के

1
<item name = "colorAccent"> # 000000 </ item> का उपयोग करके colorControlNormal के बजाय मेरे लिए काम किया।
माइकऑस्कर इको

एप्लिकेशन में केवल एक संपादन पाठ को बदलने के लिए बिल्कुल सही! (वास्तव में मुझे क्या चाहिए! धन्यवाद)
रोमेन बारबियर

99

इसका उपयोग करके XML में बदला जा सकता है:

संदर्भ API के लिए> = 21 संगतता उपयोग:

android:backgroundTint="@color/blue"

पिछड़े एपीआई के लिए <21 संगतता उपयोग:

app:backgroundTint="@color/blue"

10
हां, हालांकि यह केवल एंड्रॉइड एपीआई संस्करणों 21+ (किटकैट और लॉलीपॉप) के लिए काम करता है। एक शायद एक पिछड़े संगत समाधान बनाने की कोशिश करेगा।
DaMachk

12
पिछड़े संगत समर्थन backgroundTint="@color/blue"के android:backgroundTint="@color/blue"लिए बस का उपयोग करें
किशन वाघेला

11
@KishanVaghela, android:backgroundTint="@color/blue"उपयोग app:backgroundTint="@color/blue"करने के बजाय , पूर्व-लॉलीपॉप उपकरणों का समर्थन करने के लिए उपयोग करें, आपकी टिप्पणी के लिए धन्यवाद!
blueware

2
@blueware यदि आप इसे शैली में उपयोग करना चाहते हैं, तो हमें "ऐप" का उपयोग करने की आवश्यकता नहीं है।
किशन वाघेला

tools:ignore="MissingPrefix"अगर एक लाल अंडर पॉप पॉप जोड़ेंapp:backgroundTint="<your color>"
मूसा Aprico

47

यहाँ एपीआई <21 और ऊपर के लिए समाधान है

Drawable drawable = yourEditText.getBackground(); // get current EditText drawable 
drawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP); // change the drawable color

if(Build.VERSION.SDK_INT > 16) {
    yourEditText.setBackground(drawable); // set the new drawable to EditText
}else{
    yourEditText.setBackgroundDrawable(drawable); // use setBackgroundDrawable because setBackground required API 16
}

यहां छवि विवरण दर्ज करें

आशा है कि यह मदद करेगा


@CoolMind देर से प्रतिक्रिया के लिए खेद है। मैंने इस कोड को समर्थन लाइब्रेरी 24.2.1में 25.1.1, 25.2.0डिवाइस <21 और> 21 के लिए फिर से जांचा है और यह अभी भी काम कर रहा है। कृपया इस सरल डेमो ड्राइव की जांच करें । http://www.file/d/0B_poNaia6t8kSzU3bDFVazRSSDA/… । मुझे नहीं पता कि यह कोड आपके लिए काम क्यों नहीं करता है तो कृपया मुझे बताएं। धन्यवाद
फ़ान Van Linh

@ रेन्जिथ को देर से प्रतिक्रिया के लिए खेद है, कृपया ऊपर मेरी टिप्पणी की जाँच करें
फान वान

आप इस कोड के साथ डिफ़ॉल्ट रूप से रंग कैसे रीसेट करते हैं?
नेफा

35

स्वीकृत उत्तर प्रति शैली के आधार पर थोड़ा अधिक है, लेकिन आपके लिए सबसे कुशल बात यह है कि इस तरह से अपने AppTheme शैली में colorAccent विशेषता जोड़ें :

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:editTextStyle">@style/EditTextStyle</item>
</style>

<style name="EditTextStyle" parent="Widget.AppCompat.EditText"/>

ColorAccent विशेषता पूरे ऐप में विजेट टिनिंग के लिए उपयोग की जाती है और इस तरह इसे स्थिरता के लिए उपयोग किया जाना चाहिए


8
@ टॉमाज़ ने यह एपीआई 21+ की आवश्यकता नहीं है क्योंकि मूल विषय
AppCompat है

Ughhh। इसके लिए धन्यवाद, मैं name="android:colorAccent"गलती से इस्तेमाल कर रहा था
जूल्स

29

यदि आप उपयोग कर रहे हैं तो आप अपने विजेट्स को टिंट करने के appcompat-v7:22.1.0+लिए ड्राएबल.कॉम का उपयोग कर सकते हैं

    public static void tintWidget(View view, int color) {
        Drawable wrappedDrawable = DrawableCompat.wrap(view.getBackground());
        DrawableCompat.setTint(wrappedDrawable.mutate(), getResources().getColor(color));
        view.setBackgroundDrawable(wrappedDrawable);
    }

क्या एक जीवनरक्षक यह कमाल है, यह शर्म की बात नहीं है
pt123

कृपया नीचे जाएँ और डिज़ाइन लाइब्रेरी 23.2.0 के लिए मेरा उत्तर देखें। यह तरीका अभी बेकार है।
यविनम

21

उपयोग:

<EditText
    app:backgroundTint="@color/blue"/>

यह पूर्व-लॉलीपॉप उपकरणों का समर्थन करेगा न केवल _


@ पाउडर366, क्या आप अपना ऐप मुख्य विषय पर पोस्ट कर सकते हैं?
ब्लरवेयर

1
<शैली का नाम = "AppTheme" जनक = "Theme.AppCompat.Light.DarkActionBar">
पाउडर 366

2
@ powder366, इस प्रयास करें: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">और यह काम करना चाहिए
blueware

19

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>

</style>


यह काम करता हैं! जैसा कि प्रश्न पूछता है, इसे शैली / विषय में हल किया जाना चाहिए, यह सही उत्तर होना चाहिए।
निंजा

मैं सहमत हूँ। यह सही उत्तर होना चाहिए क्योंकि यह एक वैश्विक समाधान है
सांताक्रैब

यह असुविधाजनक है अगर अलग-अलग नियंत्रणों को अलग-अलग रंगों की आवश्यकता होती है।
जूलियस

12

आपकी समस्या का एक त्वरित समाधान है, आप यर्रैपस्पैकेज / बिल्ड / इंटरमीडिएट / एक्सप्लोडेड-आरएआर / कॉम.एंड्रॉएड.आईपीआर / एपीकंपेट-वी 7 / रेस / ड्राएबल / में एबीसी_एडिट_टेक्स्ट-मेटेरियट.एक्सएमएल के लिए देख सकते हैं और उस xml फ़ाइल को अपने ड्रॉबल फोल्डर में कॉपी कर सकते हैं। फिर आप अपनी वरीयताओं से मेल खाने के लिए, इस चयनकर्ता के अंदर से 9 पैच फ़ाइलों का रंग बदल सकते हैं।


9

यह बहुत आसान है बस android:backgroundTintअपने में विशेषता जोड़ें EditText

android:backgroundTint="@color/blue"
android:backgroundTint="#ffffff"
android:backgroundTint="@color/red"


 <EditText
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:backgroundTint="#ffffff"/>

2
एपीआई छुट्टी 21 से ऊपर backgroundTint
अश्विन एच

ViewCompat.setBackgroundTintList (EditText, ColorStateList.valueOf (Color.YELLOW))
Arst

1
app:backgroundTint="@color/blue"सभी एपीआई स्तरों पर काम करता है .. हालाँकि जो भी कारण से यह अभी भी एक अलग रंग में बदल रहा है जब चयनित XD
EpicPandaForce

8

यहाँ TextInputLayoutसपोर्ट डिज़ाइन लाइब्रेरी ( संस्करण 23.2.0 के लिए अद्यतन ) के स्रोत कोड का एक हिस्सा है , जो EditTextसरल तरीके से नीचे की रेखा का रंग बदलता है :

private void updateEditTextBackground() {
    ensureBackgroundDrawableStateWorkaround();

    final Drawable editTextBackground = mEditText.getBackground();
    if (editTextBackground == null) {
        return;
    }

    if (mErrorShown && mErrorView != null) {
        // Set a color filter of the error color
        editTextBackground.setColorFilter(
                AppCompatDrawableManager.getPorterDuffColorFilter(
                        mErrorView.getCurrentTextColor(), PorterDuff.Mode.SRC_IN));
    }
    ...
}

ऐसा लगता है कि उपरोक्त सभी कोड 23.2.0 में अभी बेकार हो जाते हैं यदि आप प्रोग्राम को रंग बदलना चाहते हैं।

और यदि आप सभी प्लेटफार्मों का समर्थन करना चाहते हैं, तो यहां मेरी विधि है:

/**
 * Set backgroundTint to {@link View} across all targeting platform level.
 * @param view the {@link View} to tint.
 * @param color color used to tint.
 */
public static void tintView(View view, int color) {
    final Drawable d = view.getBackground();
    final Drawable nd = d.getConstantState().newDrawable();
    nd.setColorFilter(AppCompatDrawableManager.getPorterDuffColorFilter(
            color, PorterDuff.Mode.SRC_IN));
    view.setBackground(nd);
}

AppCompatDrawableManager क्या है? setBackground को API 16 की आवश्यकता है।
CoolMind

8

मैं भी इस समस्या पर बहुत समय से अटका हुआ था।

मुझे एक समाधान की आवश्यकता थी जो v21 से ऊपर और नीचे दोनों संस्करणों के लिए काम करता था।

मैंने अंत में एक बहुत ही सरल शायद आदर्श नहीं बल्कि प्रभावी उपाय खोजा: बस transparentEditText गुणों में पृष्ठभूमि रंग सेट करें ।

<EditText
    android:background="@android:color/transparent"/>

मुझे आशा है कि यह किसी को कुछ समय बचाता है।


1
यह पूरी पृष्ठभूमि का रंग बदल रहा है, और हम केवल रंग को बदलना चाहते हैं।
शाहज़ैन अली

@ शहज़ैन अली एडिटलाइन का अंडरलाइन एक पृष्ठभूमि है। यदि आप इसे शून्य पर सेट करते हैं, तो यह चला गया। और यही कारण है कि बैकग्राउंड
टिंट

7

मेरे लिए मैंने दोनों AppTheme और एक value color.xml को संशोधित किया है, दोनों ColorControlNormal और colorAccent ने मुझे EditText बॉर्डर कलर बदलने में मदद की। साथ ही कर्सर, और "|" जब एक EditText के अंदर।

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorControlNormal">@color/yellow</item>
    <item name="colorAccent">@color/yellow</item>
</style>

यहाँ रंग है। xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="yellow">#B7EC2A</color>
</resources>

मैंने एंड्रॉइड को बाहर निकाल लिया: textCursorDrawable Feature to @null जिसे मैंने EditText स्टाइल के अंदर रखा। जब मैंने इसका इस्तेमाल करने की कोशिश की, तो रंग नहीं बदले।


2
इसका उत्तर होना चाहिए
मीना समी

एक जादू की तरह काम किया। धन्यवाद
डेनिश शर्मा

6

आप इसे प्राप्त करने के लिए edittext की पृष्ठभूमि को माइनस पैडिंग के साथ एक आयत पर सेट कर सकते हैं, इसे प्राप्त करने के लिए। यहाँ xml उदाहरण है:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:top="-1dp"
        android:left="-1dp"
        android:right="-1dp"
        android:bottom="1dp"
        >
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#6A9A3A"/>
        </shape>
    </item>
</layer-list>

यदि आप केंद्रित संपादन के लिए अलग चौड़ाई और रंग प्रदान करना चाहते हैं, तो आकार को एक चयनकर्ता से बदलें।


5

Activit.XML में कोड जोड़ें

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/editText"
        android:hint="Informe o usuário"
        android:backgroundTint="@android:color/transparent"/>

BackgroundTint=colorअपने इच्छित रंग के लिए कहाँ


5

मैं इस विधि का उपयोग पोर्टरडफ के साथ लाइन के रंग को बदलने के लिए करता हूं, जिसमें कोई अन्य ड्रॉबल नहीं है।

public void changeBottomColorSearchView(int color) {
    int searchPlateId = mSearchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
    View searchPlate = mSearchView.findViewById(searchPlateId);
    searchPlate.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}

क्या एक समान पहचानकर्ता एक सरल EditText की निचली रेखा तक पहुंचने के लिए मौजूद है?
रेमी पी।

4

यदि आप एप्लिकेशन रंगों का उपयोग किए बिना नीचे की रेखा बदलना चाहते हैं, तो अपने विषय में इन पंक्तियों का उपयोग करें:

<item name="android:editTextStyle">@android:style/Widget.EditText</item>
<item name="editTextStyle">@android:style/Widget.EditText</item>

मैं एक और समाधान नहीं जानता।


4

मैंने 2 दिनों के संघर्ष के बाद इस समस्या के लिए एक समाधान का काम किया, नीचे समाधान उनके लिए एकदम सही है जो केवल कुछ संपादित पाठ बदलना चाहते हैं, जावा कोड के माध्यम से रंग बदलना / टॉगल करना चाहते हैं, और ओएस संस्करणों पर विभिन्न व्यवहार की समस्याओं को दूर करना चाहते हैं। setColorFilter () पद्धति का उपयोग करने के कारण।

    import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.AppCompatDrawableManager;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import com.newco.cooltv.R;

public class RqubeErrorEditText extends AppCompatEditText {

  private int errorUnderlineColor;
  private boolean isErrorStateEnabled;
  private boolean mHasReconstructedEditTextBackground;

  public RqubeErrorEditText(Context context) {
    super(context);
    initColors();
  }

  public RqubeErrorEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    initColors();
  }

  public RqubeErrorEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initColors();
  }

  private void initColors() {
    errorUnderlineColor = R.color.et_error_color_rule;

  }

  public void setErrorColor() {
    ensureBackgroundDrawableStateWorkaround();
    getBackground().setColorFilter(AppCompatDrawableManager.getPorterDuffColorFilter(
        ContextCompat.getColor(getContext(), errorUnderlineColor), PorterDuff.Mode.SRC_IN));
  }

  private void ensureBackgroundDrawableStateWorkaround() {
    final Drawable bg = getBackground();
    if (bg == null) {
      return;
    }
    if (!mHasReconstructedEditTextBackground) {
      // This is gross. There is an issue in the platform which affects container Drawables
      // where the first drawable retrieved from resources will propogate any changes
      // (like color filter) to all instances from the cache. We'll try to workaround it...
      final Drawable newBg = bg.getConstantState().newDrawable();
      //if (bg instanceof DrawableContainer) {
      //  // If we have a Drawable container, we can try and set it's constant state via
      //  // reflection from the new Drawable
      //  mHasReconstructedEditTextBackground =
      //      DrawableUtils.setContainerConstantState(
      //          (DrawableContainer) bg, newBg.getConstantState());
      //}
      if (!mHasReconstructedEditTextBackground) {
        // If we reach here then we just need to set a brand new instance of the Drawable
        // as the background. This has the unfortunate side-effect of wiping out any
        // user set padding, but I'd hope that use of custom padding on an EditText
        // is limited.
        setBackgroundDrawable(newBg);
        mHasReconstructedEditTextBackground = true;
      }
    }
  }

  public boolean isErrorStateEnabled() {
    return isErrorStateEnabled;
  }

  public void setErrorState(boolean isErrorStateEnabled) {
    this.isErrorStateEnabled = isErrorStateEnabled;
    if (isErrorStateEnabled) {
      setErrorColor();
      invalidate();
    } else {
      getBackground().mutate().clearColorFilter();
      invalidate();
    }
  }
}

एक्सएमएल में उपयोग करता है

<com.rqube.ui.widget.RqubeErrorEditText
            android:id="@+id/f_signup_et_referral_code"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toEndOf="@+id/referral_iv"
            android:layout_toRightOf="@+id/referral_iv"
            android:ems="10"
            android:hint="@string/lbl_referral_code"
            android:imeOptions="actionNext"
            android:inputType="textEmailAddress"
            android:textSize="@dimen/text_size_sp_16"
            android:theme="@style/EditTextStyle"/>

शैली में लाइनें जोड़ें

<style name="EditTextStyle" parent="android:Widget.EditText">
    <item name="android:textColor">@color/txt_color_change</item>
    <item name="android:textColorHint">@color/et_default_color_text</item>
    <item name="colorControlNormal">@color/et_default_color_rule</item>
    <item name="colorControlActivated">@color/et_engagged_color_rule</item>
  </style>

जावा कोड टॉगल रंग

myRqubeEditText.setErrorState(true);
myRqubeEditText.setErrorState(false);

2

मैं इस समस्या से बिल्कुल चकित था। मैंने इस धागे में, और दूसरों में सब कुछ करने की कोशिश की थी, लेकिन मैंने जो कुछ भी किया था वह अंडरलाइन का रंग डिफ़ॉल्ट नीले रंग के अलावा और कुछ भी नहीं बदल सका।

मैंने आखिर पता लगा लिया कि क्या चल रहा है। android.widget.EditTextएक नया उदाहरण बनाते समय मैं (गलत तरीके से) उपयोग कर रहा था ( लेकिन मेरे बाकी पुर्जे एपकॉम लाइब्रेरी से थे)। मुझे इस्तेमाल करना चाहिए था android.support.v7.widget.AppCompatEditText। मैं बदल new EditText(this)गया new AppCompatEditText(this) और समस्या तुरंत हल हो गई। यह पता चला है, यदि आप वास्तव में उपयोग कर रहे हैं, तो AppCompatEditTextयह सिर्फ accentColorआपके विषय (जैसा कि ऊपर कई टिप्पणियों में उल्लेख किया गया है) से सम्मान करेगा और कोई अतिरिक्त कॉन्फ़िगरेशन आवश्यक नहीं है।


2

यह सबसे आसान और सबसे कुशल / पुन: प्रयोज्य / सभी एपीआई पर काम करता है
एक कस्टम एडिट टेक्स्ट बनाएं जैसे:

public class EditText extends android.widget.EditText {
    public EditText(Context context) {
        super(context);
        init();
    }

    public EditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
    }
}

फिर इसे इस तरह उपयोग करें:

 <company.com.app.EditText
        android:layout_width="200dp"
        android:layout_height="wrap_content"/>

2

EditText बैकग्राउंड को गतिशील रूप से बदलने के लिए, आप ColorStateList का उपयोग कर सकते हैं ।

int[][] states = new int[][] {
    new int[] { android.R.attr.state_enabled}, // enabled
    new int[] {-android.R.attr.state_enabled}, // disabled
    new int[] {-android.R.attr.state_checked}, // unchecked
    new int[] { android.R.attr.state_pressed}  // pressed
};

int[] colors = new int[] {
    Color.BLACK,
    Color.RED,
    Color.GREEN,
    Color.BLUE
};

ColorStateList colorStateList = new ColorStateList(states, colors);

क्रेडिट्स: ColorStateList के बारे में यह SO उत्तर बहुत बढ़िया है


और किस विधि का उपयोग करना है? setBackgroundTintList? इसके लिए एपीआई 21 की आवश्यकता है।
कूलमाइंड

पुराने एपीआई जेलों के लिए setSupportBackgroundTintList।
अंकित पोपली

0

app:backgroundTintनीचे एपीआई स्तर 21 के लिए जोड़ें । अन्यथा उपयोग करेंandroid:backgroundTint

नीचे एपीआई स्तर 21 के लिए।

<EditText
     android:id="@+id/edt_name"
     android:layout_width="300dp"
     android:layout_height="wrap_content"
     android:textColor="#0012ff"
     app:backgroundTint="#0012ff"/>

एपीआई स्तर 21 से अधिक के लिए।

<EditText
     android:id="@+id/edt_name"
     android:layout_width="300dp"
     android:layout_height="wrap_content"
     android:textColor="#0012ff"
     android:backgroundTint="#0012ff"/>

-2

कृपया अपनी आवश्यकता के अनुसार इस विधि को संशोधित करें। यह मेरे लिए काम किया!

  private boolean validateMobilenumber() {
        if (mobilenumber.getText().toString().trim().isEmpty() || mobilenumber.getText().toString().length() < 10) {
            input_layout_mobilenumber.setErrorEnabled(true);
            input_layout_mobilenumber.setError(getString(R.string.err_msg_mobilenumber));
           // requestFocus(mobilenumber);
            return false;
        } else {
            input_layout_mobilenumber.setError(null);
            input_layout_mobilenumber.setErrorEnabled(false);
            mobilenumber.setBackground(mobilenumber.getBackground().getConstantState().newDrawable());
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.