2012-07-25 19 views
64

मैं EditText'sकर्सर का रंग प्रोग्रामेटिक रूप से कैसे बदल सकता हूं?edittext कर्सर रंग बदलें

एंड्रॉइड 4.0 और ऊपर, कर्सर रंग सफेद है। और यदि EditText की पृष्ठभूमि भी सफेद है, तो यह अदृश्य हो जाती है।

उत्तर

99

अपने EditText गुण में, वहाँ एक विशेषता android:textCursorDrawable

अब यह @null की तरह करने के लिए सेट,

android:textCursorDrawable="@null"

तो अब अपने EditText कर्सर अपने EditText textcolor रूप में ही है।

से Set EditText cursor color

+5

मुझे प्रोग्राम की आवश्यकता है, एक्सएमएल आधारित – Adem

+0

उपयोगी जानकारी के लिए धन्यवाद – raju

+1

@Adem अगर आप इसे एक्सएमएल में सेट करते हैं तो आप पाठ रंग के रूप में प्रोग्रामिक रूप से किसी भी रंग को सेट कर सकते हैं। – user363349

26

संदर्भ मैं इसे ठीक करने के लिए एक रास्ता मिल गया। यह सबसे बड़ा समाधान नहीं है, लेकिन यह काम करता है।

दुर्भाग्यवश, मैं केवल कर्सर रंग के लिए स्थिर रंग का उपयोग कर सकता हूं।

पहले, मैं drawable

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

में एक काला कर्सर को परिभाषित अगला मैं लेआउट में एक नमूना EditText परिभाषित करते हैं।

AttributeSet editText30AttributeSet = null; 
int res = getResources().getIdentifier("edit30", "layout", getPackageName());//edit30 is EditText layout 
XmlPullParser parser = getResources().getXml(res); 
int state=0; 
do { 
    try { 
     state = parser.next(); 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    }  
    if (state == XmlPullParser.START_TAG) { 
     if (parser.getName().equals("EditText")) { 
      editText30AttributeSet = Xml.asAttributeSet(parser); 
      break; 
     } 
    } 
} while(state != XmlPullParser.END_DOCUMENT); 
EditText view = new EditText(getContext(),editText30AttributeSet); 

अब आप एक EditText दृश्य एक काले रंग की कर्सर है कि है:

<?xml version="1.0" encoding="utf-8"?> 
<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textCursorDrawable="@drawable/blackpipe" 
     > 
    </EditText> 

जब मैं क्रम में एक EditText बनाना चाहते हैं, मैं इस का उपयोग करें। शायद कोई मेरे समाधान पर सुधार कर सकता है ताकि कर्सर रनटाइम पर बदला जा सके।

+0

महान काम, धन्यवाद! कस्टम EditText घटक के लिए एक आकर्षण की तरह काम करता है। – Divers

14

यहां, जो मुझे लगता है, @Adem पोस्ट किए गए एक बेहतर समाधान से है।

जावा:

try { 
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564 
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes"); 
    f.setAccessible(true); 
    f.set(yourEditText, R.drawable.cursor); 
} catch (Exception ignored) { 
} 

एक्सएमएल:

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

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

गुण textCursorDrawable एपीआई स्तर 12 और उच्च में उपलब्ध है ...

धन्यवाद ...

7

क्या styles.xml का उपयोग कर AppCompat-v7 के बारे में?

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

मेरे लिए काम करता है (यह उदाहरण सरल है)।

+0

क्या ये उच्चारण आपके लिए प्री-लॉलीपॉप डिवाइस पर एडिटटेक्स्ट कर्सर के लिए लागू होते हैं? –

+0

नहीं, फिर यह डिफ़ॉल्ट सिस्टम का कर्सर (दुख की बात) लेता है। अच्छे जवाब पोस्ट किए गए हैं, जिस तरह से और अधिक पूरा हो गया है। – shkschneider

6

जारेड Rummler के जवाब में सुधार लाने

जावा:

try { 
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564 
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes"); 
    f.setAccessible(true); 
    f.set(yourEditText, R.drawable.cursor); 
} catch (Exception ignored) { 
} 

रेस में custom_cursor.xml बनाने/drawable फ़ोल्डर:

<?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" /> 

एक्सएमएल:

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textCursorDrawable="@drawable/custom_cursor" 
    > 
</EditText> 
1

तो, अंतिम शब्द यहाँ है सायन - एक्सएमएल की जरूरत है और काम करता है के रूप में @null लेकिन प्रोग्राम के रूप में नहीं करता है:

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

केवल समस्या यह है कि एंड्रॉयड के कुछ नए संस्करण के साथ एक दिन काम करना बंद कर सकता है।

पीएस मैंने इसे 4.1.2 से 5.1 पर परीक्षण किया।

संबंधित मुद्दे