[android] Ändern Sie die Edittext-Cursorfarbe



Answers

Ich habe einen Weg gefunden, das zu beheben. Es ist nicht die beste Lösung, aber es funktioniert.

Leider kann ich nur statische Farbe für die Cursorfarbe verwenden.

Zuerst definiere ich einen schwarzen Cursor in Zeichen

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

Als nächstes definiere ich ein Beispiel EditText in Layouts.

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

Wenn ich zur Laufzeit einen EditText erstellen möchte, benutze ich folgendes:

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

Jetzt haben Sie eine EditText-Ansicht mit einem schwarzen Cursor. Vielleicht kann jemand meine Lösung verbessern, so dass der Cursor zur Laufzeit geändert werden kann.

Question

Wie kann ich die EditText's Cursors programmgesteuert ändern?

In Android 4.0 und höher ist die Cursorfarbe weiß. Wenn der Hintergrund von EditText ebenfalls weiß ist, wird er unsichtbar.




Was ist mit der styles.xml , die AppCompat-v7 verwendet?

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

Funktioniert für mich (dieses Beispiel ist simpel).




Stellen Sie über AppTheme ein

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:spinnerStyle">@style/spinner_style</item>
    <!--Add This-->
    <item name="editTextStyle">@style/EdittextStyle</item>
    <item name="android:dropDownListViewStyle">@style/SpinnerStyle</item>
</style>

<!--New EditText Style-->
<style name="EdittextStyle" parent="Widget.AppCompat.EditText">
    <item name="android:background">?attr/editTextBackground</item>
    <item name="android:textColor">?attr/editTextColor</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
    <!--<item name="android:textCursorDrawable">@drawable/abc_text_cursor_material</item>-->
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>

</style>



Also, hier ist die finale Version - benötigt keine XML und funktioniert als @null, aber programmatisch:

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

Das einzige Problem ist, dass es irgendwann mit einer neuen Android-Version nicht mehr funktioniert.

PS Ich habe es auf 4.1.2 bis 5.1 getestet.




Links