EditText imleç rengini ayarlama


525

Android'in Holo temasını bir tablet projesinde kullandığım bu sorunu yaşıyorum. Ancak, ekranda beyaz bir arka plana sahip bir parça var. EditTextBu parçaya bir bileşen ekliyorum . Holo.Light tema kaynaklarının arka planını ayarlayarak temayı geçersiz kılmaya çalıştım. Ancak, benim imleç (karat) beyaz kalır ve bu nedenle, ekranda görünmez (hafifçe düzenleme metin alanında tespit edebilirsiniz ..).

Herkes daha koyu bir imleç rengi kullanmak için nasıl EditText alabilirim biliyor mu? "@android:style/Widget.Holo.Light.EditText"Hiçbir olumlu sonuç ile EditText stilini ayarlamaya çalıştım .

Yanıtlar:


1169

Ayarlama android:textCursorDrawableözelliği için @nullkullanımında yol açmalıdır android:textColorimleç renk olarak.

"TextCursorDrawable" özelliği API seviye 12 ve daha üstü için kullanılabilir


24
oh adam imleç siyah olması için bir çekilebilir kadar sihirbaz çok daha verimli !! Android'i ölümüne seviyorum ama bu inanılmaz derecede kötü bir varsayılan davranış ... birisinin bunun için gerçekten şapırtılı olması gerekiyor.
Yevgeny Simkin

26
android 3.2 ve üstü .. berbat
Blundell

7
Her ne kadar sen eğer target> 3.2 Manifest'inizde kullanabilirsiniz ve alt sürümleri için göz ardı edilecektir
Blundell

5
Ayarladıysanız bunun yerine ipucu rengini kullanıyor gibi görünüyor. En azından 4.2. İmleç seçeneğinin 2.3.3-4.4'ten benim için hiç problemi yok
MinceMan

5
Bu android'in daha yeni sürümlerinde çalışmaz. Bunun yerine gri bir imleç gösterir ve vurgulama işleviyle uğraşır. Bunun yerine @ star18bit'in yanıtını kullanın.
Matthew Bahr

481

Düzende

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

Sonra drawalble xml: color_cursor oluşturun

<?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 özelliğinde beyaz renk imleciniz var.


3
"TextCursorDrawable" özelliği yalnızca API düzey 12 ve daha yüksek sürümlerde kullanılır
mr.boyfox

64
Bu doğru cevap. Pek çok insanın imleci "@ boş" olarak ayarlamanın neden iyi bir fikir gibi göründüğünden emin değilim
Greg Ennis

1
cevabın üstünde, @null sonuçları iyi göründüğü için textCursorDrawable'ı ayarlayın, ancak imlecin yönü mantıklı değil, ancak bu cevap gerçekten harika çalışıyor. Gerçekten teşekkürler
iroiroys

İmleç için farklı renklerle aynı excel'i kullanabilir miyiz?
VVB

1
bu en iyi çözümdür.
Antônio Sérgio Ferraz

71

Tüm cevaplar çalıların etrafında gidiyor gibi görünüyor.

Bölümünde EditText, özelliği kullanın:

android:textCursorDrawable="@drawable/black_cursor"

ve çekmeceyi black_cursor.xmlkaynaklarınıza aşağıdaki gibi ekleyin :

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

İhtiyacınız varsa, daha çeşitli imleçler oluşturmanın da yolu budur.


3
Bu Android 4.2 Jelly Bean'de çalışmıyor ... İmleç kayboluyor, @null gitmenin yolu.
Edgar

@Edgar Bu benim için 4.2 JB temalar düzeyinde gayet iyi çalışıyor gibi görünüyor.
mkuech

Android 4.2.2 iyi çalışıyor. Black_cursor.xml dosyasına <solid android: color = "# 000000" /> eklemeyi unutmayın
Andrei Aulaska

"TextCursorDrawable" özelliği yalnızca API düzey 12 ve daha yüksek sürümlerde kullanılır
mr.boyfox

53

Son imleç rengini değiştirmek için yeni bir yol yoktur AppcompactV21
Hemen değişim colorAccentböyle tarzında:

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

Ardından bu stili uygulama temanıza veya etkinliklerinize uygulayın.

Güncelleme : bu şekilde sadece API 21+
Güncelleme 2'de çalışır : Çalışabileceği minimum android versiyonundan emin değilim.
Android sürümü tarafından test edilmiştir:

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

1
Korkarım cevap hayır. API 18 cihazında test ettim ve çalışmıyor.
R4j

1
Sony Experia'm üzerinde çalışıyorum. PreLollipop (4.4.4). Ayrıca AppCompat kütüphanesini kullanarak. :)
vida

API 24 / Android 7.0 için çalışmaz. colorAccentörneğin alt kısmındaki satırı değiştirir EditTextancak gerçek imleç rengine dokunmaz. Oh, ve elbette artık "v21" yok.
Neph

39

Cevabı buldum :)

Temanın editText stilini şu şekilde ayarladım:

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

Sonra imleci ayarlamak için aşağıdaki çizilebilir kullandım:

'

<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 burada anahtar.


3
stackoverflow.com/questions/2658772/android-vertical-line-xml sadece bir dikey çizgi olan bir imleci çizilebilir yapmak isteyen herkes için yararlı olabilir :)
Andrew Wyld

1
pls imleç rengini programlı olarak nasıl ayarlayabileceğimizi söyler misiniz
Anil MH

Öğeyi adlandırdığımda bir sorun yaşadım android:editTextStyle, ancak düzeltmek için değiştirdim editTextStyle. Bkz. Stackoverflow.com/a/34010235/6744473
ayakkabı

24

EditTextİmleç rengini dinamik olarak ayarlaması gereken herkes için , aşağıda bunu başarmanın iki yolunu bulacaksınız.


İlk olarak, imlecinizi çizilebilir oluşturun:

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

İmleç çekilebilir kaynak kimliğini oluşturduğunuz çekmeceye ayarlayın (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) {
}

Yalnızca çizilebilir varsayılan imlecin rengini değiştirmek için aşağıdaki yöntemi kullanabilirsiniz:

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) {
    }
}

Bunun işe yaraması beni gerçekten rahatsız ediyor. AppCompatEditTextzaten setSupportBackgroundTintListböyle bir şey eklemek oldukça kolay olmaz mıydı setSupportCursorTintList?
Joseph Piché

6
@Kazak Rummler çözümünüz imleç için çalıştı, ancak imlecin altında görünen damlacık (metni seçtiğinizde iki tanesi görünür) hala orijinal renktedir. Bana bu konuda yardımcı olabilir misin?
Felipe Ribeiro R. Magalhaes

2
3. yaklaşımınız Android 9'da çalışmadı, ancak aşağıdaki sürümler için iyi oldu.
Muhammed Yalçın Kuru

11

Partiye geç, İşte cevabım,

Bu insanlar içindir değil değiştirmek isteyen colorAccent, üst tema, ama değişim istediği EditTextnitelikler!

Bu cevap nasıl değiştirileceğini gösteriyor ...

  1. Alt satır rengi
  2. İmleç rengi
  3. EditTextEtkinlik temasına uygulanan stili kullanarak imleç işaretçisi rengi (özel resmimi kullandım) ...........

resim açıklamasını buraya girin

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

Misal:

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

Şimdi bir drawable ( edit_text_background) oluşturmak arka plan için bir kaynak xml eklemek! İstediğiniz gibi özelleştirebilirsiniz!

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

Şimdi bu stili Etkinlik temanızda ayarladığınız gibi.

Misal :

Etkinliğinizde bir temanız var, bu özel editTexttemayı buna ayarlayın .

<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 thisetki yok
act262

AppCompatEditText nedir?
Charu ක

1
oh, yanılıyorum. Yanlış attr yazdım android:editTextSteyle, sağ attreditTextStyle
act262

<item name="android:textCursorDrawable">@color/white</item>çalışmıyor
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"
    />

Sonra drawalble xml oluşturun: 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

Benim için hem AppTheme'i hem de colors.xml değerini değiştirdim

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

İşte renkler.xml

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

EditText stilinin içine yerleştirdiğim @null için android: textCursorDrawable özniteliğini çıkardım. Bunu kullanmayı denediğimde renkler değişmezdi.


Evet işe yarıyor, ancak ihtiyacınız olan tek şey imleç rengini değiştirmek olduğunda diğer tema öğelerini de değiştiriyorsunuz.
AlanKley

7

Vay bu partiye çok geç kaldım ama 17 gün önce faaliyeti oldu. Bir cevap için kullandığımız Android sürümünü yayınlamayı düşünmemiz gerekecek, bu yüzden şu anda bu cevap Android 2.1 ve üstü ile çalışıyor RES / DEĞERLER / STİLLER ve aşağıdaki kod satırlarını ekleyin, imleciniz siyah olacaktır

    <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 klasörünüzde bu kod satırına ihtiyacınız olacak

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

Bunu neden geç göndereceksin? Android'in başını çektiği birçok canavar için kategori kategorilerini düşünmek güzel olabilir!


Özellik API düzeyi 21 değil 7 (2.1) gerektirir
ayakkabı

4

İşte @Jared Rummler'ın Android 9 Pie'da da çalışmak üzere uyarlanmış programlı setCursorDrawableColor () sürümü.

@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 Android 9'da
zakjma

4

colorAccentAndroid'de buna denir .

res'e git -> değerler -> styles.xml ekle

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

yoksa.


3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

XML dosyasında edittextarka plan renginin renk kodunu ayarlama


Edittext'te yanıp sönen korse kaldırmanız yeterli
Avnish Titoriya

2

Tek geçerli cevap aktivitesinin temasını değiştirmek olmalıdır: <item name="colorAccent">#000000</item> Sen kullanmamalısınız android:textCursorDrawableiçin @nullimlecin o sürükleme istiyorsanız bu sadece imlecin altında imleci kendisi değil, mil ile ilgilidir çünkü. Tema çözümü en ciddi çözümdür.


2

Başka bir basit çözüm, proje klasörünüzdeki res> değerler> renkler.xml'ye gitmek ve renk aksanının değerini tercih ettiğiniz renge göre düzenlemek olacaktır.

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

Yukarıdaki kod imlecinizi siyaha dönüştürür.


Teşekkürler, tam da aradığım şey bu
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>

Styles.xml dosyasına gidin ve renk aksanını değiştirin; bu, imleci düzenleme metni kutusundan etkiler


1

Bundan daha da kolay.

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

Bu ICS ve ötesinde çalışır. Diğer sürümlerde test etmedim.


3
bu stili EditText'inize uygulayacaksanız (bunun temanızla ilgili varsayılan olması gereken bir ana stili yoktur), Holo Teması'ndan gelen diğer tüm stilleri kaybedersiniz.
Varun

"@Null" değeri ile aynı değil mi?
Paul Verest

görünüme, etkinliğin temasını geçersiz kılan bir stil juste ekleyebilirsiniz.
JPhi Denis

1

Kullanmak gereken özel renk istiyorum olan AppCompatEditText sonra set backround null adlı

benim için çalışıyor

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

Bu özeti görün


1

Bunu kullan

android:textCursorDrawable="@color/white"

2
İmleç cihazımda kayboluyor, bu nedenle rengi doğrudan ayarlamak yerine çekilebilir bir kağıt kullanın.
Meyve

1

Mevcut Etkinlik / fragman / İletişim Kutusunda, Stiller ...;) imlecinde tanımlanan colorAccent öğesine dikkat edin, imleç rengi bununla ilgilidir.


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

Renklerin rengini değiştir Stillerde aksan. xm, bu kadar basit


0

Stil ve uygulama kullanıyorsanız

colorControlActivate

değerini bu renk / beyazdan başka bir değerle değiştirin.


0

aşağıdaki kodu düzende kullanabilirsiniz

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

0

Tüm bu tekniği bir Dialog'da denemek için çok zaman geçirdikten sonra nihayet bu fikrim vardı: temayı TextInputLayout'a değil, Dialog'un kendisine ekleyin.

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

içinde onCreate:

genel sınıf myDialog, Dialog {

private Activity activity;
private someVars;

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

alkış :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.