Atur warna kursor EditText

525

Saya mengalami masalah ini di mana saya menggunakan tema Holo Android pada proyek tablet. Namun, saya memiliki fragmen di layar yang memiliki latar belakang putih. Saya menambahkan EditTextkomponen pada fragmen ini. Saya sudah mencoba mengganti tema dengan mengatur latar belakang sumber daya tema Holo.Light. Namun, kursor teks saya (karat) tetap putih dan karenanya, tidak terlihat di layar (saya bisa melihatnya samar-samar di bidang edittext ..).

Adakah yang tahu bagaimana saya bisa mendapatkan EditText untuk menggunakan warna kursor yang lebih gelap? Saya sudah mencoba mengatur gaya EditText "@android:style/Widget.Holo.Light.EditText"tanpa hasil positif.

makan malam
sumber

Jawaban:

1169

Mengatur android:textCursorDrawableatribut @nullharus menghasilkan penggunaan android:textColorsebagai warna kursor.

Atribut "textCursorDrawable" tersedia di API level 12 dan lebih tinggi

Dekan
sumber
24
oh man yang BEGITU jauh lebih efisien daripada membayangkan gambar kursor menjadi hitam !! Saya suka Android sampai mati, tetapi ini adalah perilaku standar yang sangat buruk ... seseorang benar-benar perlu ditampar untuk itu.
Yevgeny Simkin
26
Android 3.2 dan di atas .. sucks
Blundell
7
Meskipun jika Anda target> 3,2 dalam manifes Anda dapat menggunakannya dan itu akan diabaikan untuk versi yang lebih rendah
Blundell
5
Tampaknya menggunakan warna petunjuk sebagai gantinya jika Anda mengaturnya. Setidaknya pada 4.2. Opsi kursor tidak memiliki masalah bagi saya dari 2.3.3-4.4
MinceMan
5
Ini tidak berfungsi di Android versi terbaru. Sebaliknya itu menunjukkan kursor abu-abu dan mengacaukan fungsionalitas sorot. Gunakan jawaban @ star18bit.
Matthew Bahr
481

Di Tata Letak

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

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

Anda memiliki kursor warna putih pada properti EditText.

star18bit
sumber
3
Atribut "textCursorDrawable" hanya digunakan di API level 12 dan lebih tinggi
mr.boyfox
64
Ini jawaban yang benar. Tidak yakin mengapa begitu banyak orang berpikir bahwa menetapkan kursor ke "@null" sepertinya ide yang bagus
Greg Ennis
1
jawaban di atas, atur textCursorDrawable sebagai hasil @null terlihat baik-baik saja, tetapi orientasi kursor tidak masuk akal, namun, jawaban ini bekerja sangat bagus. Sangat Terima Kasih
iroiroys
Bisakah kita menggunakan excel yang sama dengan warna berbeda untuk kursor?
VVB
1
ini solusi terbaik.
Antônio Sérgio Ferraz
71

Tampaknya semua jawaban berputar-putar.

Di Anda EditText, gunakan properti:

android:textCursorDrawable="@drawable/black_cursor"

dan tambahkan drawable black_cursor.xmlke sumber daya Anda, sebagai berikut:

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

Ini juga cara untuk membuat kursor yang lebih beragam, jika Anda perlu.

Zach-M
sumber
3
Ini tidak berfungsi di Android 4.2 Jelly Bean ... Kursor menghilang, @null adalah jalan yang harus dituju.
Edgar
@ Edgar Ini sepertinya bekerja untuk saya di 4.2 JB baik-baik saja di tingkat tema.
mkuech
Android 4.2.2 berfungsi dengan baik. Jangan lupa untuk menambahkan <solid android: color = "# 000000" /> di black_cursor.xml
Andrei Aulaska
Atribut "textCursorDrawable" hanya digunakan di API level 12 dan lebih tinggi
mr.boyfox
53

Ada cara baru untuk mengubah warna kursor di Appcompactv21 terbaru.
Cukup ubah colorAccentgaya seperti ini:

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

Kemudian terapkan gaya ini pada tema atau aktivitas aplikasi Anda.

Pembaruan : cara ini hanya berfungsi pada API 21+
Pembaruan 2 : Saya tidak yakin versi Android minimum yang dapat bekerja.
Diuji oleh versi android:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked
R4j
sumber
1
Saya khawatir jawabannya tidak. Saya menguji pada perangkat API 18 dan tidak berhasil.
R4j
1
Bekerja pada Sony Experia saya. PreLollipop (4.4.4). Juga menggunakan pustaka AppCompat. :)
vida
Tidak berfungsi untuk API 24 / Android 7.0. colorAccentperubahan misalnya garis di bagian bawah EditTexttetapi tidak menyentuh warna kursor yang sebenarnya. Oh, dan tidak ada "v21" lagi tentu saja.
Neph
39

Saya menemukan jawabannya :)

Saya telah mengatur gaya editText Tema ke:

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

Lalu saya telah menggunakan drawable berikut untuk mengatur kursor:

`

<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 adalah kuncinya di sini.

makan malam
sumber
3
stackoverflow.com/questions/2658772/android-vertical-line-xml mungkin berguna bagi siapa saja yang ingin membuat kursor dapat digambar yang hanya berupa garis vertikal :)
Andrew Wyld
1
dapatkah Anda memberi tahu cara mengatur warna kursor secara terprogram
Anil MH
Saya memiliki masalah ketika menamai item tersebut android:editTextStyle, tetapi mengubahnya untuk editTextStylememperbaikinya. Lihat stackoverflow.com/a/34010235/6744473
sepatu
24

Bagi siapa pun yang perlu mengatur EditTextwarna kursor secara dinamis, di bawah ini Anda akan menemukan dua cara untuk mencapai ini.


Pertama, buat kursor Anda dapat digambar:

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

Setel id sumber daya yang dapat ditarik kursor ke drawable yang Anda buat (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) {
}

Untuk hanya mengubah warna yang dapat ditarik kursor default, Anda dapat menggunakan metode berikut:

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
sumber
Sangat mengganggu saya bahwa ini berhasil. AppCompatEditTextsudah setSupportBackgroundTintList, jadi bukankah cukup sederhana untuk menambahkan sesuatu seperti setSupportCursorTintList?
Joseph Piché
6
@Jared Rummler solusi Anda berfungsi untuk kursor, tetapi tetesan yang muncul di bawah kursor (ketika Anda memilih teks itu muncul dua di antaranya) masih berwarna asli. Bisakah Anda membantu saya dengan ini?
Felipe Ribeiro R. Magalhaes
2
3. Pendekatan Anda tidak berfungsi di Android 9 tetapi berlaku untuk versi di bawah ini.
Muhammed Yalçın Kuru
11

Terlambat ke pesta, Inilah jawaban saya,

Ini untuk orang-orang yang tidak ingin mengubah colorAccenttema orang tua mereka, tetapi ingin mengubah EditTextatribut!

Jawaban ini menunjukkan bagaimana cara mengubah ......

  1. Warna garis bawah
  2. Warna kursor
  3. Warna kursor kursor (saya menggunakan gambar khusus saya) .......... EditTextmenggunakan gaya yang diterapkan pada tema Aktivitas.

masukkan deskripsi gambar di sini

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

Contoh:

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

Sekarang buat drawable ( edit_text_background) tambahkan xml sumber daya untuk latar belakang! Anda dapat menyesuaikan sesuai keinginan!

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

Sekarang setelah Anda mengatur gaya ini dalam tema Aktivitas Anda.

Contoh:

Di Aktivitas Anda, Anda memiliki tema, atur editTexttema khusus ini ke situ.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
Charu ක
sumber
<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thistidak berpengaruh
act262
apakah itu AppCompatEditText?
Charu ක
1
oh, aku salah. Saya menulis attr yang salah android:editTextSteyle, attr benar adalaheditTextStyle
act262
<item name="android:textCursorDrawable">@color/white</item>tidak berfungsi
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"
    />

Kemudian buat 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>
arus
sumber
7

Bagi saya, saya memodifikasi AppTheme dan nilai colors.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>

Berikut adalah colors.xml

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

Saya mengeluarkan atribut android: textCursorDrawable ke @null yang saya tempatkan di dalam gaya editText. Ketika saya mencoba menggunakan ini, warnanya tidak akan berubah.

Emily Alexandra Conroyd
sumber
Ya itu berfungsi tetapi kemudian Anda juga mengubah elemen tema lainnya saat yang Anda perlukan hanyalah mengubah warna kursor.
AlanKley
7

Wow, saya benar-benar terlambat ke pesta ini, tetapi sudah beraktifitas 17 hari yang lalu. Kita perlu mempertimbangkan untuk memposting versi Android apa yang kita gunakan untuk jawaban sehingga mulai sekarang jawaban ini bekerja dengan Android 2.1 dan di atasnya. Pergi ke RES / NILAI / GAYA dan tambahkan baris kode di bawah ini dan kursor Anda akan menjadi hitam

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

Anda akan memerlukan baris kode ini di folder RES / COLOR Anda

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

Mengapa memposting ini terlambat? Mungkin menyenangkan untuk mempertimbangkan beberapa bentuk kategori untuk monster Android berkepala banyak telah menjadi!

Vektor
sumber
Atribut memerlukan API level 21 bukan 7 (2.1)
sepatu
4

Di sini versi setCursorDrawableColor () terprogram @Jared Rummler diadaptasi untuk bekerja juga pada Android 9 Pie.

@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
sumber
1
java.lang.NoSuchFieldException: No field mDrawableForCursor di Android 9.
zakjma
4

yang disebut colorAccentdi Android.

pergi ke res -> values ​​-> styles.xml add

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

jika tidak ada.

Niamatullah Bakhshi
sumber
3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

Dalam file xml atur kode edittextwarna warna latar belakang

Avnish Titoriya
sumber
Hapus saja korsor yang berkedip dalam edittext
Avnish Titoriya
2

Satu-satunya jawaban yang valid adalah mengubah tema aktivitas: <item name="colorAccent">#000000</item> Anda tidak boleh menggunakan android:textCursorDrawableto @nullkarena ini hanya menyangkut kursor itu sendiri tetapi bukan pin di bawah kursor jika Anda ingin menyeret kursor itu. Solusi bertema adalah yang paling serius.

JPhi Denis
sumber
2

Solusi sederhana lain adalah dengan pergi ke res> values> colors.xml di folder proyek Anda dan edit nilai aksen warna ke warna yang Anda sukai

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

Kode di atas mengubah kursor Anda menjadi hitam.

xwax
sumber
Terima kasih, itulah tepatnya yang saya cari
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>

Pergi ke styles.xml dan ubah aksen warna dan ini akan memengaruhi kursor dari kotak edittext

jangan takut
sumber
1

Bahkan lebih mudah dari itu.

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

Ini bekerja di ICS dan seterusnya. Saya belum mengujinya di versi lain.

Clark Will Battle
sumber
3
berhati-hatilah, jika Anda akan menerapkan gaya ini ke EditText Anda (ini tidak memiliki gaya induk, yang seharusnya menjadi default yang berkaitan dengan tema Anda), Anda akan kehilangan semua gaya lain yang berasal dari Holo Theme.
Varun
Bukankah sama dengan nilai "@null"?
Paul Verest
Anda dapat menambahkan gaya juste ke tampilan, yang mengesampingkan tema aktivitas.
JPhi Denis
1

Jika Anda menginginkan warna tertentu, Anda harus menggunakan AppCompatEditText, lalu backround set null

bekerja untukku

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

Lihat intinya

deniz
sumber
1

Gunakan ini

android:textCursorDrawable="@color/white"
Mohammed Alzoubi
sumber
2
Kursor menghilang di perangkat saya, jadi gunakan drawable bukan langsung mengatur warna.
Buah
1

Perhatikan colorAccent Anda di Activity / fragment / Dialog Anda saat ini, didefinisikan dalam Styles ...;) warna kursor terkait dengannya.

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

ubah warna colorAccent di styles.xm, itu sederhana

Abhishek Saini
sumber
0

Jika menggunakan gaya dan implementasikan

colorControlActivate

ganti nilainya yang lain yaitu warna / putih.

latifalbr
sumber
0

Anda dapat menggunakan kode di bawah ini dalam tata letak

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

Setelah menghabiskan banyak waktu mencoba semua teknik ini dalam Dialog, saya akhirnya memiliki ide ini: melampirkan tema ke Dialog itu sendiri dan bukan ke 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>

di dalam onCreate:

kelas publik myDialog memperluas Dialog {

private Activity activity;
private someVars;

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

Bersulang :)

Arnaud
sumber