Legen Sie die Farbe des EditText-Cursors fest

525

Ich habe dieses Problem, bei dem ich das Holo-Thema von Android für ein Tablet-Projekt verwende. Ich habe jedoch ein Fragment auf dem Bildschirm, das einen weißen Hintergrund hat. Ich füge eine EditTextKomponente zu diesem Fragment hinzu. Ich habe versucht, das Thema zu überschreiben, indem ich den Hintergrund der Holo.Light-Themenressourcen festgelegt habe. Mein Textcursor (Karat) bleibt jedoch weiß und daher auf dem Bildschirm unsichtbar (ich kann ihn im Edittext-Feld schwach erkennen.).

Weiß jemand, wie ich EditText dazu bringen kann, eine dunklere Cursorfarbe zu verwenden? Ich habe versucht, den Stil des EditText "@android:style/Widget.Holo.Light.EditText"ohne positives Ergebnis festzulegen .

dineth
quelle

Antworten:

1169

Das Setzen des android:textCursorDrawableAttributs auf @nullsollte zur Verwendung android:textColorals Cursorfarbe führen.

Das Attribut "textCursorDrawable" ist in API-Level 12 und höher verfügbar

Dean
quelle
24
Oh Mann, das ist so viel effizienter als ein Zeichen zu zaubern, damit der Cursor schwarz ist !! Ich liebe Android zu Tode, aber das ist so ein unglaublich schlechtes Standardverhalten ... jemand muss wirklich dafür geschlagen werden.
Jewgeni Simkin
26
Android 3.2 und höher .. saugt
Blundell
7
Wenn Sie target> 3.2 in Ihrem Manifest haben, können Sie es verwenden und es wird für niedrigere Versionen ignoriert
Blundell
5
Scheint stattdessen die Hinweisfarbe zu verwenden, wenn Sie sie einstellen. Zumindest am 4.2. Die Cursor-Option hat für mich vom 2.3.3-4.4
MinceMan
5
Dies funktioniert nicht in neueren Versionen von Android. Stattdessen wird ein grauer Cursor angezeigt und die Hervorhebungsfunktionalität wird beeinträchtigt. Verwenden Sie stattdessen die Antwort von @ star18bit.
Matthew Bahr
481

Im Layout

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

Erstellen Sie dann drawalble 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>

Sie haben einen weißen Farbcursor auf der EditText-Eigenschaft.

star18bit
quelle
3
Das Attribut "textCursorDrawable" wird nur in API-Level 12 und höher verwendet
mr.boyfox
64
Dies ist die richtige Antwort. Ich bin mir nicht sicher, warum so viele Leute da draußen denken, dass es eine gute Idee ist, den Cursor auf "@null" zu setzen
Greg Ennis,
1
Setzen Sie über der Antwort textCursorDrawable, da die Ergebnisse von @null gut aussehen, aber die Ausrichtung des Cursors macht keinen Sinn. Diese Antwort funktioniert jedoch sehr gut. Wirklich danke
iroiroys
Können wir dasselbe Excel mit unterschiedlichen Farben für den Cursor verwenden?
VVB
1
Dies ist die beste Lösung.
Antônio Sérgio Ferraz
71

Es scheint, als ob alle Antworten um die Büsche gehen.

EditTextVerwenden Sie in Ihrem die Eigenschaft:

android:textCursorDrawable="@drawable/black_cursor"

und fügen Sie das Drawable black_cursor.xmlwie folgt zu Ihren Ressourcen hinzu:

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

Auf diese Weise können Sie bei Bedarf auch verschiedene Cursor erstellen.

Zach-M
quelle
3
Dies funktioniert nicht unter Android 4.2 Jelly Bean ... Der Cursor verschwindet, @null ist der richtige Weg.
Edgar
@Edgar Dies scheint für mich auf 4.2 JB auf Themenebene gut zu funktionieren.
Mkuech
Android 4.2.2 funktioniert gut. Vergessen Sie nicht, <solid android: color = "# 000000" /> in black_cursor.xml
Andrei Aulaska
Das Attribut "textCursorDrawable" wird nur in API Level 12 und höher verwendet
mr.boyfox
53

Es gibt eine neue Möglichkeit, die AppcompactCursorfarbe in Version 21 zu
ändern. Ändern Sie einfach den colorAccentStil wie folgt :

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

Wenden Sie diesen Stil dann auf Ihr App-Thema oder Ihre Aktivitäten an.

Update : Auf diese Weise funktioniert es nur mit API 21+
Update 2 : Ich bin nicht sicher, welche Android-Mindestversion es funktionieren kann.
Getestet von der Android-Version:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked
R4j
quelle
1
Ich fürchte, die Antwort ist nein. Ich habe auf einem API 18-Gerät getestet und es funktioniert nicht.
R4j
1
Ich arbeite an meiner Sony Experia. PreLollipop (4.4.4). Verwenden Sie auch die AppCompat-Bibliothek. :)
Vida
Funktioniert nicht für API 24 / Android 7.0. colorAccentändert zB die Linie am unteren Rand eines EditText, berührt aber nicht die tatsächliche Cursorfarbe. Oh, und es gibt natürlich kein "v21" mehr.
Neph
39

Ich habe die Antwort gefunden :)

Ich habe den editText-Stil des Themas auf Folgendes festgelegt:

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

Dann habe ich das folgende Zeichen verwendet, um den Cursor zu setzen:

`

<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 ist hier der Schlüssel.

dineth
quelle
3
stackoverflow.com/questions/2658772/android-vertical-line-xml kann für jeden von Nutzen sein, der einen Cursor zeichnbar machen möchte, der nur eine vertikale Linie ist :)
Andrew Wyld
1
Können Sie bitte sagen, wie wir die Cursorfarbe programmgesteuert einstellen können
Anil MH
Ich hatte ein Problem, als ich das Element benannte android:editTextStyle, aber es änderte, um es zu editTextStylebeheben. Siehe stackoverflow.com/a/34010235/6744473
Schuh
24

Für alle, die die EditTextCursorfarbe dynamisch einstellen müssen, finden Sie unten zwei Möglichkeiten, um dies zu erreichen.


Erstellen Sie zunächst Ihren Cursor zum Zeichnen:

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

Setzen Sie die Cursor-Drawable-Ressourcen-ID auf das von Ihnen erstellte Drawable (https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564">source). ::

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

Um nur die Farbe des Standard-Cursors zu ändern, können Sie die folgende Methode verwenden:

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) {
    }
}
Jared Rummler
quelle
Es stört mich wirklich, dass das funktioniert. AppCompatEditTexthat es schon setSupportBackgroundTintList, also wäre es nicht ziemlich einfach, so etwas hinzuzufügen setSupportCursorTintList?
Joseph Piché
6
@Jared Rummler Ihre Lösung hat für den Cursor funktioniert, aber das Tröpfchen, das unter dem Cursor angezeigt wird (wenn Sie den Text auswählen, werden zwei davon angezeigt), hat immer noch die ursprüngliche Farbe. Kannst du mir dabei helfen?
Felipe Ribeiro R. Magalhaes
2
Ihr 3. Ansatz hat in Android 9 nicht funktioniert, ist aber für die folgenden Versionen in Ordnung.
Muhammed Yalçın Kuru
11

Spät zur Party, hier ist meine Antwort:

Dies ist für Personen gedacht, die das übergeordnete Thema nicht ändern colorAccentmöchten, aber EditTextAttribute ändern möchten!

Diese Antwort zeigt, wie man sich ändert ......

  1. Fazit Farbe
  2. Cursorfarbe
  3. Cursorzeigerfarbe (ich habe mein benutzerdefiniertes Bild verwendet) .......... der EditTextVerwendung des auf das Aktivitätsthema angewendeten Stils.

Geben Sie hier die Bildbeschreibung ein

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

Beispiel:

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

Erstellen Sie jetzt eine drawable ( edit_text_background) und fügen Sie eine Ressourcen-XML für den Hintergrund hinzu. Sie können sie nach Ihren Wünschen anpassen!

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

Nun, da Sie diesen Stil in Ihrem Aktivitätsthema festgelegt haben.

Beispiel:

In Ihrer Aktivität haben Sie ein Thema, setzen Sie dieses benutzerdefinierte editTextThema darauf.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
Charu ක
quelle
<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thiskeine Wirkung
act262
ist es AppCompatEditText?
Charu ක
1
Oh, ich liege falsch. Ich schrieb falsch attr android:editTextSteyle, richtig attr isteditTextStyle
act262
<item name="android:textCursorDrawable">@color/white</item>funktioniert nicht
Vlad
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"
    />

Dann erstelle drawalble 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>
Zustrom
quelle
7

Für mich habe ich sowohl das AppTheme als auch einen Wert color.xml geändert

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

Hier ist die colours.xml

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

Ich habe das Attribut android: textCursorDrawable für @null entfernt, das ich im editText-Stil platziert habe. Wenn ich dies versuchte, änderten sich die Farben nicht.

Emily Alexandra Conroyd
quelle
Ja, das funktioniert, aber dann ändern Sie auch andere Themenelemente, wenn Sie möglicherweise nur die Cursorfarbe ändern müssen.
AlanKley
7

Wow, ich bin sehr spät zu dieser Party, aber sie hatte vor 17 Tagen Aktivität. Es wäre naheliegend, dass wir überlegen müssten, welche Android-Version wir für eine Antwort verwenden. Ab sofort funktioniert diese Antwort mit Android 2.1 und höher. Gehe zu RES / VALUES / STYLES und fügen Sie die folgenden Codezeilen hinzu, und Ihr Cursor wird schwarz

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

Sie benötigen diese Codezeile in Ihrem RES / COLOR-Ordner

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

Warum so spät posten? Es könnte schön sein, eine Form von Kategorien für das vielköpfige Monster zu betrachten, zu dem Android geworden ist!

Vektor
quelle
Attribut erfordert API Level 21 nicht 7 (2.1)
Schuh
4

Hier @Jared Rummlers programmatische Version setCursorDrawableColor (), die auch für Android 9 Pie geeignet ist.

@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);
    }
}
Oliver Jonas
quelle
1
java.lang.NoSuchFieldException: No field mDrawableForCursor auf Android 9.
zakjma
4

das heißt colorAccentin Android.

Gehen Sie zu res -> values ​​-> styles.xml add

<item name="colorAccent">#FFFFFF</item>

wenn nicht vorhanden.

Niamatullah Bakhshi
quelle
3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

In der XML-Datei den Farbcode der edittextHintergrundfarbe festlegen

Avnish Titoriya
quelle
Entfernen Sie einfach den Corsor, der in edittext blinkt
Avnish Titoriya
2

Die einzig gültige Antwort sollte darin bestehen, das Thema der Aktivität zu ändern: <item name="colorAccent">#000000</item> Sie sollten das android:textCursorDrawableto nicht verwenden , @nullda dies nur den Cursor selbst betrifft, nicht jedoch den Stift unter dem Cursor, wenn Sie diesen Cursor ziehen möchten. Die Themenlösung ist die schwerwiegendste.

JPhi Denis
quelle
2

Eine andere einfache Lösung wäre, in Ihrem Projektordner zu res> values> colours.xml zu gehen und den Wert des Farbakzents auf die gewünschte Farbe zu bearbeiten

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

Der obige Code ändert Ihren Cursor in Schwarz.

xwachse
quelle
Danke, genau das habe ich gesucht
Shivam Jha
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>

Gehen Sie zu styles.xml und ändern Sie den Farbakzent. Dies beeinflusst den Cursor aus dem Edittext-Feld

Dave o Grady
quelle
1

Es ist noch einfacher als das.

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

Dies funktioniert in ICS und darüber hinaus. Ich habe es nicht in anderen Versionen getestet.

Clark wird kämpfen
quelle
3
Achtung, wenn Sie diesen Stil auf Ihren EditText anwenden möchten (dies hat keinen übergeordneten Stil, der die Standardeinstellung für Ihr Thema sein sollte), verlieren Sie alle anderen Stile, die aus dem Holo-Thema stammen.
Varun
Ist es nicht dasselbe wie der Wert "@null"?
Paul Verest
Sie können einer Ansicht einen Style Juste hinzufügen, der das Thema der Aktivität überschreibt.
JPhi Denis
1

Wenn Sie eine bestimmte Farbe wünschen, müssen Sie AppCompatEditText verwenden und dann den Hintergrund auf null setzen

funktioniert bei mir

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

Sehen Sie diesen Kern

denizs
quelle
1

Benutze das

android:textCursorDrawable="@color/white"
Mohammed Alzoubi
quelle
2
Der Cursor verschwindet auf meinem Gerät. Verwenden Sie daher eine Zeichenfunktion, anstatt die Farbe direkt einzustellen.
Obst
1

Achten Sie auf Ihren colorAccent in Ihrer aktuellen Aktivität / Fragment / Dialog, definiert in Stile ...;) Die Cursorfarbe hängt damit zusammen.

Arnaud
quelle
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" />

Ändern Sie die Farbe von colorAccent in styles.xm, das ist ganz einfach

Abhishek Saini
quelle
0

Wenn Sie Stil verwenden und implementieren

colorControlActivate

Ersetzen Sie den anderen Wert als Farbe / Weiß.

latifalbr
quelle
0

Sie können den folgenden Code im Layout verwenden

android:textCursorDrawable="@color/red"
        android:textColor="@color/black
Tienanhvn
quelle
0

Nachdem ich viel Zeit damit verbracht hatte, all diese Techniken in einem Dialog auszuprobieren, kam mir endlich die Idee: Hängen Sie das Thema an den Dialog selbst und nicht an das TextInputLayout an.

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

in onCreate:

öffentliche Klasse myDialog erweitert Dialog {

private Activity activity;
private someVars;

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

Prost :)

Arnaud
quelle