EditText 커서 색상 설정


525

태블릿 프로젝트에서 Android의 Holo 테마를 사용하는 경우이 문제가 있습니다. 그러나 화면에 흰색 배경의 조각이 있습니다. EditText이 조각에 구성 요소를 추가하고 있습니다. Holo.Light 테마 리소스의 배경을 설정하여 테마를 재정의하려고했습니다. 그러나 텍스트 커서 (캐럿)는 흰색으로 유지되므로 화면에 보이지 않습니다 (편집 텍스트 필드에서 희미하게 볼 수 있습니다.).

누구든지 EditText가 더 어두운 커서 색상을 사용하도록하는 방법을 알고 있습니까? "@android:style/Widget.Holo.Light.EditText"긍정적 인 결과없이 EditText 스타일을 설정하려고했습니다 .

답변:


1168

설정 android:textCursorDrawable특성은하기 @null의 사용을 초래한다 android:textColor커서 색상으로.

"textCursorDrawable"속성은 API 레벨 12 이상에서 사용 가능합니다.


24
커서가 검은 색이되도록 드로어 블을 정리하는 것보다 훨씬 효율적인 오! 나는 안드로이드를 죽이는 것을 좋아하지만 이것은 엄청나게 나쁜 기본 행동입니다 ... 누군가가 그것을 위해 때려야합니다.
예브게니 심킨

26
안 드 로이드 3.2 이상 .. 짜증
Blundell

7
비록 당신이 경우 target> 3.2 매니페스트에 당신은 그것을 사용할 수 있으며 낮은 버전 무시됩니다
Blundell은

5
힌트 색상을 설정하면 대신 사용합니다. 최소한 4.2. 커서 옵션은 2.3.3-4.4에서 나에게 아무런 문제가 없습니다.
MinceMan

5
최신 버전의 Android에서는 작동하지 않습니다. 대신 회색 커서가 표시되고 강조 표시 기능이 엉망입니다. 대신 @ star18bit의 답변을 사용하십시오.
Matthew Bahr

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

64
이것이 정답입니다. 왜 그렇게 많은 사람들이 커서“@null”로 커서를 설정하는 것이 좋은 생각처럼 보인다고 생각하는지
Greg Ennis

1
위의 답변에서 textCursorDrawable을 @null 결과로 보이지만 커서의 방향이 맞지 않지만이 답변은 실제로 효과적입니다. 정말 감사합니다
iroiroys

커서에 다른 색상으로 동일한 Excel을 사용할 수 있습니까?
VVB

1
이것이 가장 좋은 해결책입니다.
Antônio Sérgio Ferraz

71

마치 모든 대답이 덤불 주위를 돌아 다니는 것처럼 보입니다.

에서 다음 EditText속성을 사용하십시오.

android:textCursorDrawable="@drawable/black_cursor"

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

@ Edgar 이것은 테마 레벨에서 4.2 JB에서 잘 작동하는 것 같습니다.
mkuech

안드로이드 4.2.2는 잘 작동합니다. 추가하는 것을 잊지 마십시오 black_cursor.xml에 <무 안드로이드 / 색상 = "# 000000">
안드레이 Aulaska에게

"textCursorDrawable"속성은 API 레벨 12 이상에서만 사용됩니다.
mr.boyfox

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 : 작동 할 수있는 최소 안드로이드 버전을 잘 모르겠습니다.
안드로이드 버전으로 테스트 :

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

1
나는 대답이 '아니요'라고 두려워합니다. API 18 장치에서 테스트했지만 작동하지 않습니다.
R4j

1
소니 Experia에서 작업 중입니다. PreLollipop (4.4.4). 또한 AppCompat 라이브러리를 사용합니다. :)
vida

API 24 / Android 7.0에서는 작동하지 않습니다. colorAccent예를 들어 하단의 라인을 변경 EditText하지만 실제 커서 색상에 닿지 않습니다. 그리고 더 이상 "v21"은 없습니다.
니프

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은 단지 수직 라인입니다 :) 커서 그릴 수 있도록하고자하는 사람에게 유용 할 수 있습니다
앤드류 Wyld

1
프로그래밍 방식으로 커서 색상을 설정하는 방법을 알려줄 수 있습니까?
Anil MH

item 이름을 지정할 때 문제가 android:editTextStyle있었지만이를 editTextStyle수정하도록 변경 했습니다.
shoe

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않습니까?
Joseph Piché

6
@Jared Rummler 솔루션이 커서에서 효과가 있었지만 커서 아래에 나타나는 물방울 (텍스트를 선택할 때 두 가지로 나타남)은 여전히 ​​원래 색상입니다. 이것 좀 도와 줄래?
Felipe Ribeiro R. Magalhaes 2016 년

2
귀하의 접근 방식은 Android 9에서는 작동하지 않지만 아래 버전에서는 적합합니다.
Muhammed Yalçın Kuru

11

파티에 늦게, 여기 내 대답이 있습니다.

이것은하는 사람들을위한 하지 을 변경하고자하는 colorAccent부모 테마로하지만, 변화를 원하는 EditText속성!

이 답변은 변경하는 방법을 보여줍니다 ......

  1. 결론 선 색상
  2. 커서 색
  3. 커서 포인터 색상 (사용자 정의 이미지를 EditText사용했습니다 ) .......... 활동 테마에 적용된 스타일 사용.

여기에 이미지 설명을 입력하십시오

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

1
오, 틀렸어 잘못된 속성을 썼습니다 android:editTextSteyle. 오른쪽 속성은editTextStyle
act262

<item name="android:textCursorDrawable">@color/white</item>작동하지 않음
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"
    />

그런 다음 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>

editText 스타일 안에 넣은 @null에 android : textCursorDrawable 속성을 가져 왔습니다. 이것을 사용해 보았을 때 색상이 변하지 않았습니다.


예, 작동하지만 커서 색상을 변경하는 것만으로도 다른 테마 요소를 변경할 수 있습니다.
AlanKley

7

와우 나는이 파티에 늦었지만 활동이 17 일 전에 있었다. 우리는 답변에 사용중인 Android 버전을 게시하는 것을 고려해야하므로 현재이 답변은 Android 2.1 이상에서 작동합니다 .RES /로 이동 값 / 스타일을 입력하고 아래 코드 줄을 추가하면 커서가 검은 색이됩니다.

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

왜 이것을 늦게 게시해야합니까? 안드로이드로 향한 많은 몬스터들에게 어떤 형태의 카테고리를 고려하는 것이 좋을 것입니다!


속성에는 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 안드로이드 9에
zakjma

4

그것은 colorAccent안드로이드 에서 호출 됩니다.

res-> values-> styles.xml로 이동하십시오.

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

존재하지 않는 경우.


3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

XML 파일의 색상 코드 설정 edittext배경 색상을


edittext에서 깜박 거리는 코저를 제거하십시오
Avnish Titoriya

2

활동의 테마를 변경하는 유일한 올바른 대답은 다음과 같습니다. to를 <item name="colorAccent">#000000</item> 사용하면 안됩니다 . 커서를 끌어 오려는 경우 커서 자체에만 관련되어 있고 커서 아래의 핀에는 영향을 미치지 않기 때문입니다. 테마 솔루션이 가장 심각한 솔루션입니다.android:textCursorDrawable@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로 이동하여 색상 악센트를 변경하면 편집 텍스트 상자에서 커서에 영향을 미칩니다.


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

이것을 사용하십시오

android:textCursorDrawable="@color/white"

2
장치에서 커서가 사라 지므로 색상을 직접 설정하는 대신 드로어 블을 사용하십시오.
과일

1

Styles ...;)에 정의 된 현재 활동 / 조각 / 대화 상자에서 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

대화 상자 에서이 모든 기술을 시도하는 데 많은 시간을 보낸 후에 마침내이 아이디어를 얻었습니다. 테마를 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 확장 대화 {

private Activity activity;
private someVars;

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

건배 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.