EditText कर्सर रंग सेट करें


525

मुझे यह समस्या आ रही है कि मैं टैबलेट प्रोजेक्ट पर एंड्रॉइड की होलो थीम का उपयोग कैसे कर रहा हूं। हालांकि, मेरे पास स्क्रीन पर एक टुकड़ा है जिसमें एक सफेद पृष्ठभूमि है। मैं EditTextइस टुकड़े पर एक घटक जोड़ रहा हूँ । मैंने Holo.Light थीम संसाधनों की पृष्ठभूमि सेट करके थीम को ओवरराइड करने की कोशिश की है। हालांकि, मेरा टेक्स्ट कर्सर (कैरेट) सफेद रहता है और इसलिए, स्क्रीन पर अदृश्य होता है (मैं इसे एडिटेक्स फील्ड में बेहोश कर सकता हूं ..)।

क्या किसी को पता है कि मैं एक गहरे कर्सर रंग का उपयोग करने के लिए EditText कैसे प्राप्त कर सकता हूं? मैंने "@android:style/Widget.Holo.Light.EditText"बिना किसी सकारात्मक परिणाम के साथ EditText की शैली सेट करने की कोशिश की है ।

जवाबों:


1168

android:textCursorDrawableविशेषता को सेट करने @nullका परिणाम android:textColorकर्सर के रंग के रूप में होना चाहिए ।

"TextCursorDrawable" विशेषता एपीआई स्तर 12 और उच्चतर में उपलब्ध है


24
ओह यार जो कि काला होने के लिए कर्सर के लिए एक drawable को समेटने की तुलना में बहुत अधिक कुशल है !! मुझे एंड्रॉइड मौत से प्यार है लेकिन यह एक ऐसा अविश्वसनीय रूप से बुरा डिफ़ॉल्ट व्यवहार है ... किसी को वास्तव में इसके लिए स्मैक की आवश्यकता होती है।
येवगेनी सिम्किन

26
Android 3.2 और ऊपर .. बेकार है
Blundell

7
यद्यपि यदि आप targetअपने मेनिफ़ेस्ट में 3.2> आप इसका उपयोग कर सकते हैं और इसे निचले संस्करणों के लिए अनदेखा किया जाएगा
Blundell

5
यदि आप इसे सेट करने के बजाय संकेत रंग का उपयोग करने के लिए लगता है। कम से कम 4.2 पर। कर्सर विकल्प के लिए मेरे लिए कोई समस्या नहीं है। 2.3.3-4.4
मिस्मान मैन

5
यह एंड्रॉइड के हाल के संस्करणों में काम नहीं करता है। इसके बजाय यह एक ग्रे कर्सर दिखाता है और हाइलाइट कार्यक्षमता के साथ गड़बड़ करता है। इसके बजाय @ star18bit के उत्तर का उपयोग करें।
मैथ्यू बह्र

481

लेआउट में

<EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textCursorDrawable="@drawable/color_cursor"
    />

फिर ड्रॉबल xml बनाएं: color_cursor

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <size android:width="3dp" />
    <solid android:color="#FFFFFF"  />
</shape>

आपके पास EditText संपत्ति पर एक सफेद रंग का कर्सर है।


3
"TextCursorDrawable" विशेषता केवल एपीआई स्तर 12 और उच्चतर में उपयोग की जाती है
mr.boyfox

64
यह सही जवाब है। निश्चित नहीं है कि इतने सारे लोग यह क्यों सोचते हैं कि "@null" को कर्सर सेट करना एक अच्छा विचार है
ग्रेग एनिस

1
उपरोक्त उत्तर, textCursorDrawable सेट करें क्योंकि @null परिणाम ठीक दिखते हैं, लेकिन कर्सर के उन्मुखीकरण का कोई मतलब नहीं है, हालांकि, यह उत्तर वास्तव में बहुत अच्छा काम करता है। वास्तव में धन्यवाद
iroiroys

क्या हम कर्सर के लिए विभिन्न रंगों के साथ एक ही एक्सेल का उपयोग कर सकते हैं?
VVB

1
यह सबसे अच्छा उपाय है।
एंटोनियो सेर्जियो फ़राज़

71

ऐसा प्रतीत होता है जैसे सभी उत्तर झाड़ियों के चारों ओर घूमते हैं।

अपने में EditText, संपत्ति का उपयोग करें:

android:textCursorDrawable="@drawable/black_cursor"

और black_cursor.xmlअपने संसाधनों में शामिल करने योग्य है, इस प्रकार है:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <size android:width="1dp" />
    <solid android:color="#000000"/>
</shape>

यदि आप की जरूरत है, तो यह अधिक विविध कर्सर बनाने का भी तरीका है।


3
यह एंड्रॉइड 4.2 जेली बीन पर काम नहीं करता है ... कर्सर गायब हो जाता है, @null जाने का रास्ता है।
एडगर

@ एडगर यह मेरे लिए 4.2 JB पर काम करने के लिए थीम स्तर पर ठीक लगता है।
mkuech

Android 4.2.2 ठीक काम करता है। जोड़ने के लिए मत भूलना <ठोस Android: color = "# 000000" /> in black_cursor.xml
आंद्रेई औलास्का

"TextCursorDrawable" विशेषता केवल एपीआई स्तर 12 और उच्चतर में उपयोग की जाती है
mr.boyfox

53

नवीनतम Appcompactv21 में कर्सर का रंग बदलने का एक नया तरीका है,
बस colorAccentइस तरह से शैली में परिवर्तन करें:

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette-->

    <!-- colorPrimary is used for the default action bar background -->
    <item name="colorPrimary">#088FC9</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">#088FC9</item>

    <!-- colorAccent is used as the default value for colorControlActivated
         which is used to tint widgets -->
    <!-- THIS IS WHAT YOU'RE LOOKING FOR -->
    <item name="colorAccent">#0091BC</item> 
</style>

फिर इस शैली को अपने ऐप थीम या गतिविधियों पर लागू करें।

अपडेट : यह तरीका केवल एपीआई 21+
अपडेट 2 पर काम करता है : मुझे यकीन नहीं है कि यह न्यूनतम एंड्रॉइड संस्करण है जो यह काम कर सकता है।
Android संस्करण द्वारा परीक्षण किया गया:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked

1
मुझे डर है कि जवाब नहीं है। मैंने API 18 डिवाइस पर परीक्षण किया है और यह काम नहीं करता है।
R4j

1
मेरे Sony Experia पर काम करना। प्री लॉलीपॉप (4.4.4)। इसके अलावा AppCompat पुस्तकालय का उपयोग कर। :)
विदा ida

API 24 / Android 7.0 के लिए काम नहीं करता है। colorAccentपरिवर्तन लेकिन उदाहरण के लिए EditTextयह वास्तविक कर्सर के रंग को नहीं छूता है ओह, और अब कोई "v21" नहीं है।
नेफा

39

मुझे जवाब मिला :)

मैंने थीम की editText शैली को इसमें सेट कर दिया है:

<item name="android:editTextStyle">@style/myEditText</item>

फिर मैंने कर्सर सेट करने के लिए निम्नलिखित योग्‍य का उपयोग किया है:

`

<style name="myEditText" parent="@android:style/Widget.Holo.Light.EditText">
    <item name="android:background">@android:drawable/editbox_background_normal</item>
    <item name="android:textCursorDrawable">@android:drawable/my_cursor_drawable</item>
    <item name="android:height">40sp</item>
</style>

`

Android: textCursorDrawable यहाँ कुंजी है।


3
stackoverflow.com/questions/2658772/android-vertical-line-xml किसी भी व्यक्ति को एक कर्सर खींचने योग्य बनाने के लिए उपयोग करने के लिए हो सकता है जो कि सिर्फ एक ऊर्ध्वाधर रेखा है :)
एंड्रयू व्याल

1
क्या आप बता सकते हैं कि हम प्रोग्राम कलर को कर्सर को कैसे सेट कर सकते हैं
अनिल एमएच

मेरे पास एक मुद्दा था जब मैंने आइटम का नाम दिया था android:editTextStyle, लेकिन इसे editTextStyleतय करने के लिए बदल दिया। देखें stackoverflow.com/a/34010235/6744473
जूता

24

किसी को भी, जिसे EditTextकर्सर को गतिशील रूप से सेट करने की आवश्यकता है , नीचे आपको इसे प्राप्त करने के दो तरीके मिलेंगे।


सबसे पहले, अपने कर्सर को बनाने योग्य बनाएं:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#ff000000" />

    <size android:width="1dp" />

</shape>

आपके द्वारा बनाए गए ड्रॉबल के लिए कर्सर ड्रा करने योग्य संसाधन आईडी सेट करें (https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TgetView.java#L562-564"> स्रोत)) :

try {
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

डिफ़ॉल्ट कर्सर का रंग बदलने के लिए, आप निम्न विधि का उपयोग कर सकते हैं:

public static void setCursorDrawableColor(EditText editText, int color) {
    try {
        Field fCursorDrawableRes = 
            TextView.class.getDeclaredField("mCursorDrawableRes");
        fCursorDrawableRes.setAccessible(true);
        int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
        Field fEditor = TextView.class.getDeclaredField("mEditor");
        fEditor.setAccessible(true);
        Object editor = fEditor.get(editText);
        Class<?> clazz = editor.getClass();
        Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
        fCursorDrawable.setAccessible(true);

        Drawable[] drawables = new Drawable[2];
        Resources res = editText.getContext().getResources();
        drawables[0] = res.getDrawable(mCursorDrawableRes);
        drawables[1] = res.getDrawable(mCursorDrawableRes);
        drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        fCursorDrawable.set(editor, drawables);
    } catch (final Throwable ignored) {
    }
}

यह वास्तव में मुझे परेशान करता है कि यह काम करता है। AppCompatEditTextपहले से ही है setSupportBackgroundTintList, इसलिए यह कुछ जोड़ने के लिए काफी सरल नहीं होगा setSupportCursorTintList?
1948 में जोसेफ पिच

6
@Jared Rummler आपके समाधान ने कर्सर के लिए काम किया, लेकिन ड्रॉपलेट जो कर्सर के नीचे दिखाई देता है (जब आप पाठ का चयन करते हैं तो यह उनमें से दो प्रतीत होता है) अभी भी मूल रंग के हैं। क्या आप इसमें मेरी सहायता कर सकते है?
फेलिप रिबेरो आर। मगलहेस

2
आपका 3. दृष्टिकोण एंड्रॉइड 9 में काम नहीं करता था लेकिन नीचे के संस्करणों के लिए ठीक था।
मुहम्मद यालकन कुरु

11

पार्टी के लिए देर से, यहाँ मेरा जवाब है,

यह उन लोगों के लिए है जो अपने मूल विषय में बदलाव नहीं देख रहे हैं colorAccent, लेकिन EditTextविशेषताओं को बदलना चाहते हैं !

इस जवाब को कैसे बदला जाए ……

  1. नीचे की रेखा का रंग
  2. कर्सर का रंग
  3. कर्सर पॉइंटर रंग (मैंने अपनी कस्टम छवि का EditTextउपयोग किया ) .......... गतिविधि विषय पर लागू शैली का उपयोग कर रहा है।

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

<android.support.v7.widget.AppCompatEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hey" />

उदाहरण:

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">#8AFFFFFF</item>
    <item name="android:background">@drawable/edit_text_background</item> // background (bottom line at this case)
    <item name="android:textCursorDrawable">@color/white</item>  // Cursor
    <item name="android:textSelectHandle">@drawable/my_white_icon</item> // For pointer normal state and copy text state
    <item name="android:textSelectHandleLeft">@drawable/my_white_icon</item>
    <item name="android:textSelectHandleRight">@drawable/my_white_icon</item>
</style>

अब एक drawable ( edit_text_background) बैकग्राउंड के लिए एक संसाधन xml बनाएँ ! आप जैसा चाहें वैसा कस्टमाइज़ कर सकते हैं!

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="0dp"
        android:left="-3dp"   
        android:right="-3dp"
        android:top="-3dp">

        <shape android:shape="rectangle">
            <stroke
                android:width="1dp"
                android:color="@color/white"/>
        </shape>
    </item>
    </layer-list>

अब जैसा कि आपने अपनी गतिविधि विषय में इस शैली को निर्धारित किया है।

उदाहरण :

आपकी गतिविधि में आपके पास एक थीम है, इस कस्टम editTextथीम को उसी पर सेट करें ।

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>

<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thisकोई प्रभाव नहीं
act262

क्या यह AppCompatEditText है?
चारु Char

1
ओह, मैं गलत हूं। मैंने लिखा गलत android:editTextSteyleeditTextStyle
एट्रर

<item name="android:textCursorDrawable">@color/white</item>काम नहीं करता है
व्लाद

8
Edittext cursor color you want changes your color.
   <EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textCursorDrawable="@drawable/color_cursor"
    />

फिर ड्रॉबल xml बनाएं: color_cursor

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <size android:width="3dp" />
    <solid android:color="#FFFFFF"  />
</shape>

7

मेरे लिए मैंने दोनों AppTheme और एक value color.xml को संशोधित किया

<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 स्टाइल के अंदर रखा। जब मैंने इसका इस्तेमाल करने की कोशिश की, तो रंग नहीं बदले।


हाँ जो काम करता है लेकिन फिर आप अन्य विषय तत्वों को भी बदलते हैं जब आपको आवश्यकता हो सकती है कर्सर के रंग को बदलने की।
एलनकेले

7

वाह मैं इस पार्टी के लिए देर से वास्तविक हूं, लेकिन इसकी 17 दिन पहले गतिविधि हुई है। हमें सीवन करने पर विचार करना होगा कि हम एंड्रॉइड के किस संस्करण का उपयोग एक उत्तर के लिए कर रहे हैं, इसलिए अब यह उत्तर एंड्रॉइड 2.1 और ऊपर के साथ काम करता है। VALUES / STYLES और नीचे दी गई कोड की लाइनें जोड़ें और आपका कर्सर काला हो जाएगा

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!--<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
    <!-- Customize your theme here. -->
    <item name="colorControlActivated">@color/color_Black</item>
    <!--Sets COLOR for the Cursor in EditText  -->
</style>

आपको अपने RES / COLOR फ़ोल्डर में कोड की इस पंक्ति की आवश्यकता होगी

<color name="color_Black">#000000</color>

यह देर से पोस्ट क्यों? कई प्रमुख राक्षस Android के लिए कुछ प्रकार की श्रेणियों पर विचार करना अच्छा हो सकता है!


विशेषता एपीआई स्तर 21 नहीं 7 (2.1) की आवश्यकता है
जूता

4

यहाँ @Jared Rummler के प्रोग्रामेटिक सेटसर्वररॉडेबलकोलर () संस्करण को एंड्रॉइड 9 पाई पर भी काम करने के लिए अनुकूलित किया गया है।

@SuppressWarnings({"JavaReflectionMemberAccess", "deprecation"})
public static void setCursorDrawableColor(EditText editText, int color) {

    try {
        Field cursorDrawableResField = TextView.class.getDeclaredField("mCursorDrawableRes");
        cursorDrawableResField.setAccessible(true);
        int cursorDrawableRes = cursorDrawableResField.getInt(editText);
        Field editorField = TextView.class.getDeclaredField("mEditor");
        editorField.setAccessible(true);
        Object editor = editorField.get(editText);
        Class<?> clazz = editor.getClass();
        Resources res = editText.getContext().getResources();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            Field drawableForCursorField = clazz.getDeclaredField("mDrawableForCursor");
            drawableForCursorField.setAccessible(true);
            Drawable drawable = res.getDrawable(cursorDrawableRes);
            drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
            drawableForCursorField.set(editor, drawable);
        } else {
            Field cursorDrawableField = clazz.getDeclaredField("mCursorDrawable");
            cursorDrawableField.setAccessible(true);
            Drawable[] drawables = new Drawable[2];
            drawables[0] = res.getDrawable(cursorDrawableRes);
            drawables[1] = res.getDrawable(cursorDrawableRes);
            drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
            drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
            cursorDrawableField.set(editor, drawables);
        }
    } catch (Throwable t) {
        Log.w(TAG, t);
    }
}

1
java.lang.NoSuchFieldException: No field mDrawableForCursor एंड्रॉइड 9 पर
zakjma



2

वैध जवाब गतिविधि के विषय बदलने के लिए किया जाना चाहिए: <item name="colorAccent">#000000</item> आप उपयोग नहीं करना चाहिए android:textCursorDrawableकरने के लिए @nullयदि आप खींचें कि कर्सर करना चाहते हैं क्योंकि यह केवल खुद कर्सर नहीं बल्कि कर्सर नीचे पिन से संबंधित है। थीमिंग समाधान सबसे गंभीर है।


2

एक और सरल उपाय यह होगा कि आप अपने प्रोजेक्ट फ़ोल्डर में res> मान> color.xml पर जाएं और आपके द्वारा पसंद किए गए रंग में रंग उच्चारण के मूल्य को संपादित करें

<color name="colorAccent">#000000</color>

उपरोक्त कोड आपके कर्सर को काले रंग में बदलता है।


धन्यवाद, यह वही है जो मैं ढूंढ रहा था
शिवम झा

2
<resources>

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

स्टाइल.एक्सएमएल पर जाएं और रंग लहजे को बदलें और यह एडिटेक्स बॉक्स से कर्सर को प्रभावित करेगा


1

यह उससे भी आसान है।

<style name="MyTextStyle">
    <item name="android:textCursorDrawable">#000000</item>
</style>

यह ICS और उसके बाद के काम करता है। मैंने अन्य संस्करणों में इसका परीक्षण नहीं किया है।


3
सावधान, यदि आप इस शैली को अपने EditText पर लागू करने जा रहे हैं (इसमें कोई मूल शैली नहीं है, जो आपके विषय से संबंधित डिफ़ॉल्ट होनी चाहिए), तो आप होलो थीम से आने वाले अन्य सभी स्टाइल को ढीला कर देंगे।
वरुण

क्या यह "@null" मान के समान नहीं है?
पॉल वेरेस्ट

आप एक शैली जस्ट को एक दृश्य में जोड़ सकते हैं, जो गतिविधि के विषय को ओवरराइड करता है।
जेपी डेनिस

1

क्या आप विशिष्ट रंग चाहते हैं जो आपको AppCompatEditText का उपयोग करना चाहिए फिर बैकग्राउंड सेट नल

मेरे लिये कार्य करता है

<android.support.v7.widget.AppCompatEditText
    android:background="@null"
    android:textCursorDrawable="@color/cursorColor"/>

देखें इस सार


1

इसे इस्तेमाल करो

android:textCursorDrawable="@color/white"

2
मेरे उपकरण में कर्सर गायब हो जाता है, इसलिए प्रत्यक्ष सेट के बजाय रंग का उपयोग करें।
फल

1

अपनी वर्तमान गतिविधि / खंड / संवाद में अपने रंग पर ध्यान दें, शैलियाँ में परिभाषित ...;) कर्सर का रंग इससे संबंधित है।


0

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">#36f0ff</item>
    <item name="colorPrimaryDark">#007781</item>
    <item name="colorAccent">#000</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

परिवर्तन t. वह color.ccent में color.ccm का रंग है, यह आसान है


0

यदि शैली का उपयोग करें और कार्यान्वित करें

colorControlActivate

इसके मूल्य को अन्य रंग / सफेद से बदल दें।


0

आप लेआउट में नीचे दिए गए कोड का उपयोग कर सकते हैं

android:textCursorDrawable="@color/red"
        android:textColor="@color/black

0

एक डायलॉग में इन सभी तकनीकों को आजमाने में बहुत समय बीतने के बाद, मेरे पास आखिरकार यह विचार था: थीम को डायलॉग से ही जोड़ो न कि TextInputLayout को।

<style name="AppTheme_Dialog" parent="Theme.AppCompat.Dialog">

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorWhite</item>
    <item name="colorAccent">@color/colorPrimary</item>

</style>

अंदर बनाएँ:

पब्लिक क्लास myDialog का विस्तार डायलॉग {

private Activity activity;
private someVars;

public PopupFeedBack(Activity activity){
    super(activity, R.style.AppTheme_Dialog);
    setContentView(R.layout.myView);
    ....}}

चीयर्स :)

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