设置EditText光标颜色


525

我在平板电脑项目上使用Android的Holo主题时遇到此问题。但是,我在屏幕上有一个白色背景的片段。我EditText在此片段上添加了一个组件。我试图通过设置Holo.Light主题资源的背景来覆盖主题。但是,我的文本光标(克拉)保持白色,因此在屏幕上不可见(我可以在edittext字段中淡淡地看到它。)。

有谁知道我如何使EditText使用较深的光标颜色?我尝试将EditText的样式设置为"@android:style/Widget.Holo.Light.EditText"无积极结果。

Answers:


1168

android:textCursorDrawable属性设置为会@null导致使用android:textColor作为光标颜色。

属性“ textCursorDrawable”在API级别12和更高版本中可用


24
哦,那比想象一个可绘制对象使光标变黑要高效得多!我爱死Android,但这是一个非常糟糕的默认行为...确实需要为此而ack之以鼻。
叶夫根尼·辛金

26
android 3.2及更高版本..很烂
Blundell 2012年

7
但如果你target> 3.2在您的清单,你可以使用它,它会被忽略更低版本
布伦德尔

5
如果设置了提示颜色,则似乎改用提示颜色。至少在4.2。从2.3.3-4.4开始,游标选项对我来说没有问题
MinceMan 2013年

5
这在较新的android版本中不起作用。相反,它显示灰色光标,并且使高光显示功能混乱。请使用@ star18bit的答案。
马修·巴尔

481

布局中

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

然后创建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>

您在EditText属性上有一个白色的光标。


3
属性“ textCursorDrawable”仅在API级别12和更高级别中使用
mr.boyfox 2014年

64
这是正确的答案。不知道为什么这么多人认为将光标设置为“ @null”似乎是个好主意
Greg Ennis,

1
在以上答案中,将textCursorDrawable设置为@null结果看起来不错,但是光标的方向没有意义,但是,此答案的确非常有用。真的谢谢
iroiroys

我们可以将具有不同颜色的相同Excel用作光标吗?
VVB

1
这是最好的解决方案。
安东尼奥·塞尔吉奥·费拉斯

71

似乎所有的答案都绕过灌木丛。

在中EditText,使用属性:

android:textCursorDrawable="@drawable/black_cursor"

并将drawable添加black_cursor.xml到您的资源中,如下所示:

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

如果需要,这也是创建更多种游标的方式。


3
这在Android 4.2 Jelly Bean上不起作用...光标消失,@null是解决方法。
Edgar 2013年

@Edgar这似乎对我来说在4.2 JB上对主题级别来说还不错。
mkuech

Android 4.2.2运行正常。不要忘记在black_cursor.xml中添加<solid android:color =“#000000” />
Andrei Aulaska 2013年

属性“ textCursorDrawable”仅在API级别12和更高级别中使用
mr.boyfox 2014年

53

最新的Appcompactv21中有一种更改光标颜色的新方法,
只需更改colorAccent样式即可,如下所示:

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

然后将此样式应用于您的应用主题或活动。

更新:这种方式仅适用于API 21+
更新2:我不确定它可以正常运行的最低Android版本。
经过android版本测试:

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

1
恐怕答案是否定的。我在API 18设备上进行了测试,但无法正常工作。
R4j

1
在我的Sony Experia上工作。棒棒糖(4.4.4)。还使用AppCompat库。:)
vida 2015年

不适用于API 24 / Android 7.0。colorAccent会更改,例如,an底部的行,EditText但不会触及实际的光标颜色。哦,当然没有“ v21”了。
Neph

39

我找到了答案:)

我已经将主题的editText样式设置为:

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

然后,我使用了以下可绘制对象来设置光标:

`

<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是这里的关键。


3
stackoverflow.com/questions/2658772/android-vertical-line-xml可能适用于任何希望使可绘制游标只是一条垂直线的人:)
Andrew Wyld

1
你可以请告诉我们如何设置光标颜色编程
安尼尔MH

命名该项目时遇到了问题android:editTextStyle,但将其更改为editTextStyle固定的。见stackoverflow.com/a/34010235/6744473

24

对于需要EditText动态设置光标颜色的任何人,下面将找到两种方法来实现此目的。


首先,创建光标可绘制:

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

将光标可绘制资源ID设置为您创建的可绘制对象(https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564“>源代码)) :

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

要仅更改默认光标可绘制对象的颜色,可以使用以下方法:

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

这真的使我感到困扰。AppCompatEditText已经拥有了setSupportBackgroundTintList,那么添加这样的东西会不会很简单setSupportCursorTintList吗?
JosephPiché16年

6
@Jared Rummler您的解决方案适用于光标,但是出现在光标下方的小滴(当您选择文本时,它出现其中的两个)仍然是原始颜色。你能帮我吗?
Felipe Ribeiro R. Magalhaes

2
您的3.方法不适用于Android 9,但适用于以下版本。
MuhammedYalçınKuru,

11

晚会晚了,这是我的答案,

这是为那些希望更改colorAccent其父主题但想要更改EditText属性的人而设计的!

这个答案演示了如何改变……

  1. 底线颜色
  2. 光标颜色
  3. 光标指针颜色(我使用了自定义图像)..... EditText使用应用于Activity主题的样式。

在此处输入图片说明

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

例:

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

现在创建一个drawable(edit_text_background),为背景添加资源xml!您可以根据需要自定义!

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

现在,就像您在“活动”主题中设置此样式一样。

范例:

在“活动”中,您有一个主题,请为此自定义editText主题。

<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 this没有效果
act262

是AppCompatEditText吗?
Charuක17年

1
哦,我错了。我写错了attr android:editTextSteyle,正确的attr是editTextStyle
act262

<item name="android:textCursorDrawable">@color/white</item>不起作用
Vlad17年

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

然后创建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>

7

对我来说,我修改了AppTheme和一个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>

这是colors.xml

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

我将android:textCursorDrawable属性删除为@null,并将其放置在editText样式内。当我尝试使用它时,颜色不会改变。


是的,可以,但是当您可能需要的只是更改光标颜色时,您还可以更改其他主题元素。
阿兰克利

7

哇,我参加这个聚会真的很晚,但是它在17天前就活动了。我们需要考虑发布正在使用哪个版本的Android进行回答,所以到目前为止,此答案适用于Android 2.1及更高版本。转到RES / VALUES / STYLES并在下面添加代码行,您的光标将变为黑色

    <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文件夹中将需要此行代码

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

为什么这么晚发布?考虑多种形式的类别可能会很不错,因为Android已经成为许多头怪兽!


属性要求API级别21不是7(2.1)

4

在这里,@ Jared Rummler的程序化setCursorDrawableColor()版本适用于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);
    }
}

1
java.lang.NoSuchFieldException: No field mDrawableForCursor 在Android 9.
zakjma



2

唯一有效的答案应该是更改活动的主题: <item name="colorAccent">#000000</item> 不应使用android:textCursorDrawableto,@null因为如果要拖动该光标,它仅涉及光标本身,而不涉及光标下方的针脚。主题解决方案是最严肃的解决方案。


2

另一个简单的解决方案是转到项目文件夹中的res> values> colors.xml,然后将颜色强调的值编辑为您喜欢的颜色

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

上面的代码将光标更改为黑色。


谢谢,这正是我想要的
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并更改颜色强调,这将影响edittext框中的光标


1

它甚至比这容易。

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

这适用于ICS及更高版本。我没有在其他版本中测试过。


3
请注意,如果要将这种样式应用于EditText(没有父样式,这应该是与主题相关的默认样式),则您将放弃来自Holo主题的所有其他样式。
Varun

它和“ @null”值不一样吗?
Paul Verest

您可以在视图中添加样式样式表,以覆盖活动的主题。
JPhi Denis

1

是否要使用特定颜色,必须使用AppCompatEditText然后将backround设置为null

为我工作

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

看到这个要点



1

注意您当前的“活动” /“片段” /“对话框”中的colorAccent(在“样式...;”中定义);光标颜色与此相关。


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

在styles.xm中更改colorAccent的颜色,就这么简单


0

如果使用样式和工具

colorControlActivate

替换颜色/白色以外的其他值。


0

您可以在布局中使用以下代码

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

0

在花了很多时间在Dialog中尝试所有这些技术之后,我终于有了这个想法:将主题附加到Dialog本身而不是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>

里面onCreate:

公共类myDialog扩展了Dialog {

private Activity activity;
private someVars;

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

欢呼:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.