Definir a cor do cursor EditText

525

Estou tendo esse problema em que estou usando o tema Holo do Android em um projeto de tablet. No entanto, tenho um fragmento na tela que tem um fundo branco. Estou adicionando um EditTextcomponente neste fragmento. Tentei substituir o tema definindo o plano de fundo dos recursos do tema Holo.Light. No entanto, meu cursor de texto (quilate) permanece branco e, portanto, invisível na tela (posso identificá-lo levemente no campo edittext ..).

Alguém sabe como posso obter EditText para usar uma cor mais escura do cursor? Eu tentei definir o estilo do EditText para "@android:style/Widget.Holo.Light.EditText"sem resultado positivo.

dineth
fonte

Respostas:

1169

Definir o android:textCursorDrawableatributo como @nulldeve resultar no uso de android:textColorcomo a cor do cursor.

O atributo "textCursorDrawable" está disponível na API nível 12 e superior

reitor
fonte
24
oh cara, que é MUITO mais eficiente do que invocar um drawable para o cursor ficar preto !! Eu amo o Android até a morte, mas esse é um comportamento padrão incrivelmente ruim ... alguém realmente precisa ser golpeado por isso.
Yevgeny Simkin 13/03/2012
26
andróide 3.2 e acima .. é uma porcaria
Blundell
7
Embora se você target> 3.2 em seu manifesto, você pode usá-lo e ele será ignorado para versões mais baixos
Blundell
5
Parece usar a cor da dica, se você a definir. Pelo menos em 4.2. A opção do cursor não tem problemas para mim, de 2.3.3-4.4
MinceMan
5
Isso não funciona nas versões mais recentes do Android. Em vez disso, mostra um cursor cinza e mexe com a funcionalidade de destaque. Use a resposta de @ star18bit.
Matthew Bahr
481

No layout

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

Em seguida, crie xml drawalble: 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>

Você tem um cursor de cor branca na propriedade EditText.

star18bit
fonte
3
O atributo "textCursorDrawable" é usado apenas no API nível 12 e superior
mr.boyfox 30/09/14
64
Essa é a resposta correta. Não tenho certeza por que tantas pessoas lá fora, acho que cursor definição para "@null" parece ser uma boa ideia
Greg Ennis
1
acima da resposta, defina textCursorDrawable como os resultados @null parecem bons, mas a orientação do cursor não faz sentido; no entanto, essa resposta funciona muito bem. Realmente Graças
iroiroys
Podemos usar o mesmo excel com cores diferentes para o cursor?
VVB
1
essa é a melhor solução.
Antônio Sérgio Ferraz
71

Parece que todas as respostas vão ao redor dos arbustos.

No seu EditText, use a propriedade:

android:textCursorDrawable="@drawable/black_cursor"

e adicione o drawable black_cursor.xmlaos seus recursos, da seguinte maneira:

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

Essa também é a maneira de criar cursores mais diversos, se você precisar.

Zach-M
fonte
3
Isso não funciona no Android 4.2 Jelly Bean ... O cursor desaparece, @ nulo é o caminho a percorrer.
Edgar
@ Edgar Isso parece funcionar para mim no 4.2 JB muito bem no nível dos temas.
mkuech
O Android 4.2.2 funciona bem. Não se esqueça de adicionar <sólida android: color = "# 000000" /> em black_cursor.xml
Andrei Aulaska
O atributo "textCursorDrawable" é usado apenas no API nível 12 e superior
mr.boyfox 30/09
53

Há uma nova maneira de alterar a cor do cursor na Appcompactv21 mais recente .
Basta mudar colorAccentde estilo assim:

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

Em seguida, aplique esse estilo no tema ou nas atividades do seu aplicativo.

Atualização : dessa forma, funciona apenas na API 21+.
Atualização 2 : Não tenho certeza da versão mínima do Android que pode funcionar.
Testado pela versão android:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked
R4j
fonte
1
Receio que a resposta seja não. Eu testei no dispositivo API 18 e ele não funciona.
R4j
1
Trabalhando no meu Sony Experia. PreLollipop (4.4.4). Também usando a biblioteca AppCompat. :)
vida
Não funciona para a API 24 / Android 7.0. colorAccentmuda, por exemplo, a linha na parte inferior de um, EditTextmas não toca na cor real do cursor. Ah, e não há mais "v21", é claro.
Neph
39

Eu encontrei a resposta :)

Eu configurei o estilo editText do tema para:

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

Depois, usei o seguinte desenho para definir o cursor:

`

<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 é a chave aqui.

dineth
fonte
3
stackoverflow.com/questions/2658772/android-vertical-line-xml pode ser útil para qualquer pessoa que queira fazer um drawable cursor que é apenas uma linha vertical :)
Andrew Wyld
1
você pode pls dizer como podemos definir a cor cursor na programação
Anil MH
Tive um problema ao nomear o item android:editTextStyle, mas alterá-lo para editTextStylecorrigi-lo. Veja stackoverflow.com/a/34010235/6744473
sapato
24

Para qualquer pessoa que precise definir a EditTextcor do cursor dinamicamente, abaixo, você encontrará duas maneiras de conseguir isso.


Primeiro, crie seu cursor desenhável:

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

Defina o ID do recurso de desenho do cursor como o desenho que você criou (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) {
}

Para alterar apenas a cor do cursor padrão que você pode desenhar, você pode usar o seguinte método:

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
fonte
Realmente me incomoda que isso funcione. AppCompatEditTextjá tem setSupportBackgroundTintList, então não seria bastante simples adicionar algo parecido setSupportCursorTintList?
Joseph Piché
6
@Jared Rummler, sua solução funcionou para o cursor, mas a gota que aparece abaixo do cursor (quando você seleciona o texto, aparece duas delas) ainda tem a cor original. Você pode me ajudar com isto?
Felipe Ribeiro R. Magalhães
2
Sua abordagem não funcionou no Android 9, mas é adequada para as versões abaixo.
Muhammed Yalçın Kuru 23/11
11

Tarde da festa, aqui está a minha resposta,

Isto é para as pessoas que não desejam alterar o colorAccenttema principal, mas desejam alterar EditTextatributos!

Esta resposta demonstra como mudar ......

  1. Cor da linha inferior
  2. Cor do cursor
  3. Cor do ponteiro do cursor (usei minha imagem personalizada) .......... ao EditTextusar o estilo aplicado ao tema Atividade.

insira a descrição da imagem aqui

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

Exemplo:

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

Agora crie um drawable ( edit_text_background) e adicione um xml de recurso para o plano de fundo! Você pode personalizar como quiser!

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

Agora, como você definiu esse estilo no seu tema Atividade.

Exemplo:

Na sua Atividade, você tem um tema, defina esse editTexttema personalizado para isso.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
Charu ක
fonte
<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thisNão há efeito
act262
é AppCompatEditText?
Charu ක
1
oh, eu estou errado. Eu escrevi attr errado android:editTextSteyle, attr direita éeditTextStyle
act262
<item name="android:textCursorDrawable">@color/white</item>não funciona
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"
    />

Em seguida, crie xml drawalble: 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>
influxo
fonte
7

Para mim, modifiquei o AppTheme e um valor 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>

Aqui está o colors.xml

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

Tirei o atributo android: textCursorDrawable para @ null que coloquei dentro do estilo editText. Quando tentei usar isso, as cores não mudaram.

Emily Alexandra Conroyd
fonte
Sim, isso funciona, mas você também altera outros elementos do tema quando tudo o que você precisa é alterar a cor do cursor.
AlanKley
7

Uau, estou muito atrasado para esta festa, mas ela teve atividade há 17 dias. É necessário considerar a publicação da versão do Android que estamos usando para obter uma resposta. Agora, essa resposta funciona com o Android 2.1 e superior. Vá para RES / VALORES / ESTILOS e adicione as linhas de código abaixo e seu cursor ficará preto

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

Você precisará desta linha de código na sua pasta RES / COLOR

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

Por que postar tão tarde? Pode ser bom considerar alguma forma de categorias para o monstro de muitas cabeças que o Android se tornou!

Vetor
fonte
O atributo requer API level 21 e não 7 (2.1)
sapato
4

Aqui a versão programática do setCursorDrawableColor () de @Jared Rummler adaptada para funcionar também no 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
fonte
1
java.lang.NoSuchFieldException: No field mDrawableForCursor no Android 9.
zakjma 9/10/19
4

isso é chamado colorAccentno Android.

vá para res -> valores -> styles.xml add

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

se não existir.

Niamatullah Bakhshi
fonte
3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

No arquivo xml, defina o código de edittextcores da cor de fundo

Avnish Titoriya
fonte
Basta remover o corsor que está piscando em EditText
Avnish Titoriya
2

A única resposta válida deve ser alterar o tema da atividade: <item name="colorAccent">#000000</item> você não deve usar o android:textCursorDrawablepara @nullporque isso diz respeito apenas ao cursor em si, mas não ao alfinete abaixo do cursor, se você deseja arrastá-lo. A solução temática é a mais séria.

JPhi Denis
fonte
2

Outra solução simples seria ir para res> values> colors.xml na pasta do projeto e editar o valor do acento da cor na cor que você preferir

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

O código acima altera o cursor para preto.

xwaxes
fonte
Obrigado, isso é exatamente o que eu estava procurando
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>

Vá para styles.xml e altere o acento da cor e isso influenciará o cursor na caixa edittext

Dave O Grady
fonte
1

É ainda mais fácil que isso.

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

Isso funciona no ICS e além. Eu não testei em outras versões.

Clark Will Battle
fonte
3
cuidado, se você aplicar esse estilo ao seu EditText (este não possui um estilo pai, que deve ser o padrão referente ao seu tema), você perderá todos os outros estilos provenientes do Tema Holo.
Varun
Não é o mesmo que o valor "@null"?
Paul Verest
você pode adicionar um estilo justo a uma visualização, que substitui o tema da atividade.
precisa saber é o seguinte
1

Se você deseja uma cor específica, deve usar AppCompatEditText e depois definir nulo

funciona para mim

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

Veja esta essência

denizs
fonte
1

Usa isto

android:textCursorDrawable="@color/white"
Mohammed Alzoubi
fonte
2
O cursor desaparece no meu dispositivo, então use um drawable em vez de definir diretamente a cor.
Fruit
1

Preste atenção ao seu colorAccent na sua Atividade / fragmento / caixa de diálogo atual, definida em Estilos ...;) a cor do cursor está relacionada a ela.

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

mude a cor de colorAccent em styles.xm, é simples

Abhishek Saini
fonte
0

Se estiver usando estilo e implementação

colorControlActivate

substitua seu valor diferente de cor / branco.

latifalbr
fonte
0

você pode usar o código abaixo no layout

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

Depois de muito tempo tentando todas essas técnicas em um Diálogo, finalmente tive uma idéia: anexar o tema ao próprio Diálogo e não ao 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>

inside onCreate:

public class myDialog estende a caixa de diálogo {

private Activity activity;
private someVars;

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

Felicidades :)

Arnaud
fonte