Đặt màu con trỏ EditText


525

Tôi đang gặp vấn đề này khi tôi đang sử dụng chủ đề Holo của Android trên một dự án máy tính bảng. Tuy nhiên, tôi có một mảnh trên màn hình có nền trắng. Tôi đang thêm một EditTextthành phần trên đoạn này. Tôi đã cố gắng ghi đè chủ đề bằng cách đặt nền của tài nguyên chủ đề Holo.Light. Tuy nhiên, con trỏ văn bản của tôi (carat) vẫn có màu trắng và do đó, không nhìn thấy trên màn hình (tôi có thể phát hiện ra nó mờ nhạt trong trường edittext ..).

Có ai biết làm thế nào tôi có thể có được EditText để sử dụng màu con trỏ tối hơn không? Tôi đã thử đặt kiểu của EditText thành "@android:style/Widget.Holo.Light.EditText"không có kết quả khả quan.

Câu trả lời:


1169

Đặt android:textCursorDrawablethuộc tính thành @nullsẽ dẫn đến việc sử dụng android:textColorlàm màu con trỏ.

Thuộc tính "textCthonDrawable" có sẵn trong API cấp 12 trở lên


24
Ôi trời, thật là hiệu quả hơn nhiều so với việc tạo ra một hình vẽ cho con trỏ có màu đen !! Tôi yêu Android đến chết nhưng đây là một hành vi mặc định cực kỳ tồi tệ ... một người nào đó thực sự cần phải đập cho nó.
Yevgeny Simkin

26
android 3.2 trở lên .. hút
Blundell

7
Mặc dù nếu bạn target> 3.2 trong bảng kê khai của mình, bạn có thể sử dụng nó và nó sẽ bị bỏ qua cho các phiên bản thấp hơn
Blundell

5
Có vẻ như sử dụng màu gợi ý thay vì nếu bạn đặt nó. Ít nhất là trên 4.2. Tùy chọn con trỏ không có vấn đề gì đối với tôi từ 2.3.3-4.4
MinceMan

5
Điều này không hoạt động trong các phiên bản gần đây hơn của Android. Thay vào đó, nó hiển thị một con trỏ màu xám và lộn xộn với chức năng nổi bật. Sử dụng câu trả lời của @ star18bit thay thế.
Matthew Bahr

481

Trong Bố cục

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

Sau đó tạo drawalble xml: color_coder

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

Bạn có một con trỏ màu trắng trên thuộc tính EditText.


3
Thuộc tính "textCthonDrawable" chỉ được sử dụng trong API cấp 12 trở lên
mr.boyfox

64
Đây là câu trả lời chính xác. Không chắc chắn tại sao rất nhiều người ngoài kia nghĩ rằng đặt con trỏ thành "@null" có vẻ là một ý tưởng hay
Greg Enni

1
câu trả lời ở trên, đặt textCoderDrawable vì kết quả @null trông ổn, nhưng hướng của con trỏ không có ý nghĩa, tuy nhiên, câu trả lời này hoạt động thực sự tuyệt vời. Thực sự cảm ơn
iroiroys

Chúng ta có thể sử dụng cùng một excel với các màu khác nhau cho con trỏ không?
VVB

1
đây là giải pháp tốt nhất
Antônio Sérgio Ferraz

71

Nó xuất hiện như thể tất cả các câu trả lời đi xung quanh các bụi cây.

Trong của bạn EditText, sử dụng tài sản:

android:textCursorDrawable="@drawable/black_cursor"

và thêm drawable black_cursor.xmlvào tài nguyên của bạn, như sau:

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

Đây cũng là cách để tạo ra các con trỏ đa dạng hơn, nếu bạn cần.


3
Điều này không hoạt động trên Android 4.2 Jelly Bean ... Con trỏ biến mất, @null là cách để đi.
Edgar

@Edgar Điều này dường như hoạt động với tôi trên 4.2 JB chỉ tốt ở cấp chủ đề.
mkuech

Android 4.2.2 hoạt động tốt. Đừng quên thêm <solid android: color = "# 000000" /> trong black_coder.xml
Andrei Aulaska

Thuộc tính "textCthonDrawable" chỉ được sử dụng trong API cấp 12 trở lên
mr.boyfox

53

Có một cách mới để thay đổi màu con trỏ trong Appcompactv21 mới nhất
Chỉ cần thay đổi colorAccentkiểu như thế này:

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

Sau đó áp dụng phong cách này trên chủ đề ứng dụng hoặc hoạt động của bạn.

Cập nhật : cách này chỉ hoạt động trên API 21+
Cập nhật 2 : Tôi không chắc phiên bản Android tối thiểu mà nó có thể hoạt động.
Được thử nghiệm bởi phiên bản Android:

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

1
Tôi sợ câu trả lời là không. Tôi đã thử nghiệm trên thiết bị API 18 và nó không hoạt động.
R4j

1
Làm việc trên Sony Experia của tôi. PreLeets (4.4.4). Cũng sử dụng thư viện AppCompat. :)
vida

Không hoạt động cho API 24 / Android 7.0. colorAccentthay đổi, ví dụ như dòng ở dưới cùng của một EditTextnhưng nó không chạm vào màu con trỏ thực tế. Ồ, và dĩ nhiên không còn "v21" nữa.
Cháu

39

Tôi tìm thấy câu trả lời :)

Tôi đã đặt kiểu chỉnh sửa của Theme thành:

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

Sau đó, tôi đã sử dụng drawable sau đây để đặt con trỏ:

`

<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: textCthonDrawable là chìa khóa ở đây.


3
stackoverflow.com/questions/2658772/android-vertical-line-xml có thể được sử dụng cho bất kỳ ai muốn tạo một con trỏ có thể vẽ được chỉ là một đường thẳng đứng :)
Andrew Wyld

1
bạn có thể vui lòng cho biết làm thế nào chúng ta có thể thiết lập màu con trỏ theo chương trình
Anil MH

Tôi gặp vấn đề khi đặt tên cho vật phẩm android:editTextStyle, nhưng thay đổi nó để editTextStylesửa nó. Xem stackoverflow.com/a 432010235/6744473
giày

24

Đối với bất kỳ ai cần thiết lập EditTextmàu con trỏ động, bên dưới bạn sẽ tìm thấy hai cách để đạt được điều này.


Đầu tiên, tạo con trỏ của bạn có thể vẽ:

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

Đặt id tài nguyên có thể vẽ con trỏ thành drawable mà bạn đã tạo (https://github.com/android/pl platform_frameworks_base / blob / kitkat-release / core / java / android /widget / TexView.java # L562-564 "))) :

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

Để chỉ thay đổi màu của con trỏ mặc định có thể vẽ, bạn có thể sử dụng phương pháp sau:

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

Nó thực sự làm phiền tôi rằng điều này làm việc. AppCompatEditTextđã có setSupportBackgroundTintList, vì vậy sẽ khá đơn giản để thêm một cái gì đó như thế setSupportCursorTintListnào?
Joseph Piché

6
@Jared Rummler giải pháp của bạn hoạt động cho con trỏ, nhưng giọt xuất hiện bên dưới con trỏ (khi bạn chọn văn bản, nó xuất hiện hai trong số chúng) vẫn có màu gốc. Bạn có thể giúp tôi với điều này?
Felipe Ribeiro R. Magalhaes

2
Cách tiếp cận 3. của bạn không hoạt động trong Android 9 nhưng tốt cho các phiên bản bên dưới.
Muhammed Yalçın Kuru

11

Đến bữa tiệc muộn, đây là câu trả lời của tôi,

Điều này dành cho những người không muốn thay đổi colorAccentchủ đề gốc của họ, nhưng muốn thay đổi EditTextthuộc tính!

Câu trả lời này làm thế nào để thay đổi ......

  1. Màu dưới cùng
  2. Màu con trỏ
  3. Màu con trỏ con trỏ (Tôi đã sử dụng hình ảnh tùy chỉnh của mình) .......... EditTextsử dụng kiểu được áp dụng cho chủ đề Hoạt động.

nhập mô tả hình ảnh ở đây

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

Thí dụ:

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

Bây giờ hãy tạo drawable ( edit_text_background) thêm tài nguyên xml cho nền! Bạn có thể tùy chỉnh theo ý muốn!

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

Bây giờ như bạn đã thiết lập phong cách này trong chủ đề Hoạt động của bạn.

Thí dụ :

Trong Hoạt động của bạn, bạn có một chủ đề, đặt editTextchủ đề tùy chỉnh này thành chủ đề đó.

<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 thiskhông có hiệu lực
động262

có phải là AppCompatEditText không?
Charu

1
oh, tôi sai rồi Tôi đã viết sai attr android:editTextSteyle, đúng attr làeditTextStyle
act262

<item name="android:textCursorDrawable">@color/white</item>không hoạt động
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"
    />

Sau đó tạo 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

Đối với tôi, tôi đã sửa đổi cả AppTheme và giá trị 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>

Đây là colors.xml

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

Tôi lấy thuộc tính android: textCthonDrawable thành @null mà tôi đã đặt bên trong kiểu editText. Khi tôi thử sử dụng, màu sắc sẽ không thay đổi.


Có, nó hoạt động nhưng sau đó bạn cũng thay đổi các yếu tố chủ đề khác khi tất cả những gì bạn cần là thay đổi màu con trỏ.
AlanKley

7

Ồ, tôi đến bữa tiệc này rất muộn nhưng nó đã hoạt động 17 ngày trước. Chúng tôi sẽ xem xét việc đăng tải phiên bản Android nào chúng tôi đang sử dụng để trả lời vì vậy bây giờ câu trả lời này hoạt động với Android 2.1 trở lên Chuyển đến RES / GIÁ TRỊ / PHONG CÁCH và thêm các dòng mã bên dưới và con trỏ của bạn sẽ có màu đen

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

Bạn sẽ cần một dòng mã này trong thư mục RES / COLOR của bạn

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

Tại sao đăng bài này muộn? Có thể là tốt để xem xét một số hình thức thể loại cho nhiều quái vật đầu Android đã trở thành!


Thuộc tính yêu cầu API cấp 21 chứ không phải 7 (2.1)
giày

4

Tại đây, phiên bản setCoderDrawableColor () được lập trình của @Jared Rummler cũng được điều chỉnh để hoạt động trên 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 trên Android 9.
zakjma

4

cái đó gọi là colorAccent trong Android.

đi tới res -> giá trị -> Styles.xml thêm

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

nếu không tồn tại


3

chỉnh sửa màu

android:textCursorDrawable="@drawable/editcolor"

Trong tệp xml đặt mã màu của edittextmàu nền


Chỉ cần loại bỏ phần đệm đang nhấp nháy trong edittext
Avarn Titoriya

2

Câu trả lời hợp lệ duy nhất là thay đổi chủ đề của hoạt động: <item name="colorAccent">#000000</item> Bạn không nên sử dụng android:textCursorDrawablethành @nullvì điều này chỉ liên quan đến chính con trỏ chứ không liên quan đến chốt bên dưới con trỏ nếu bạn muốn kéo con trỏ đó. Các giải pháp theo chủ đề là một trong những nghiêm trọng nhất.


2

Một giải pháp đơn giản khác là truy cập res> value> colors.xml trong thư mục dự án của bạn và chỉnh sửa giá trị của điểm nhấn màu thành màu bạn thích

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

Mã ở trên thay đổi con trỏ của bạn thành màu đen.


Cảm ơn, đó chính xác là những gì tôi đang tìm kiếm
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>

Chuyển đến tệp XML và thay đổi dấu màu và điều này sẽ ảnh hưởng đến con trỏ từ hộp edittext


1

Nó thậm chí còn dễ dàng hơn thế.

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

Điều này hoạt động trong ICS và hơn thế nữa. Tôi đã không thử nó trong các phiên bản khác.


3
hãy cẩn thận, nếu bạn định áp dụng kiểu này cho EditText của mình (cái này không có kiểu cha mẹ, nên là mặc định liên quan đến chủ đề của bạn), bạn sẽ mất tất cả các kiểu dáng khác đến từ Chủ đề Holo.
Varun

Nó không giống với giá trị "@null" sao?
Paul Verest

bạn có thể thêm một phong cách cho một khung nhìn, ghi đè lên chủ đề của hoạt động.
JPhi Denis

1

bạn có muốn màu cụ thể không, bạn phải sử dụng AppCompatEditText sau đó backround set null

làm việc cho tôi

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

Xem ý chính này


1

Dùng cái này

android:textCursorDrawable="@color/white"

2
Con trỏ biến mất trong thiết bị của tôi, vì vậy hãy sử dụng màu vẽ thay vì đặt màu trực tiếp.
Trái cây

1

Hãy chú ý đến colorAccent của bạn trong Activity / Fragment / Dialog hiện tại của bạn, được xác định trong Styles ...;) màu con trỏ có liên quan đến nó.


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

thay đổi màu sắc của colorAccent trong style.xm, thật đơn giản


0

Nếu sử dụng phong cách và thực hiện

colorControlActivate

thay thế giá trị của nó khác màu / trắng.


0

bạn có thể sử dụng mã dưới đây trong bố trí

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

0

Sau rất nhiều thời gian thử tất cả các kỹ thuật này trong Hộp thoại, cuối cùng tôi cũng có ý tưởng này: đính kèm chủ đề vào chính Hộp thoại chứ không phải vào 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>

bên trong onCreate:

lớp công khai myDialog mở rộng Hộp thoại {

private Activity activity;
private someVars;

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

chúc mừng :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.