更改edittext光标颜色

时间:2012-07-25 12:02:53

标签: android user-interface

如何以编程方式更改EditText's 光标的颜色

在Android 4.0及更高版本中,光标颜色为白色。如果EditText的背景也是白色,则它变得不可见。

9 个答案:

答案 0 :(得分:115)

在EditText属性中,有一个属性android:textCursorDrawable

现在将其设置为 @null ,例如

android:textCursorDrawable="@null"

现在,您的EditText光标与EditText TextColor相同。

来自Set EditText cursor color的参考

答案 1 :(得分:28)

我找到了解决这个问题的方法。它不是最好的解决方案,但它确实有效。

不幸的是,我只能使用静态颜色作为光标颜色。

首先,我在drawable中定义了一个黑色光标

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

接下来,我在布局中定义一个示例EditText。

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textCursorDrawable="@drawable/blackpipe"
         >
    </EditText>

当我想在运行时创建EditText时,我使用它:

AttributeSet editText30AttributeSet = null;
int res = getResources().getIdentifier("edit30", "layout", getPackageName());//edit30 is EditText layout
XmlPullParser parser = getResources().getXml(res);
int state=0;
do {
    try {
        state = parser.next();
    } catch (Exception e1) {
        e1.printStackTrace();
    }       
    if (state == XmlPullParser.START_TAG) {
        if (parser.getName().equals("EditText")) {
            editText30AttributeSet = Xml.asAttributeSet(parser);
            break;
        }
    }
} while(state != XmlPullParser.END_DOCUMENT);
EditText view = new EditText(getContext(),editText30AttributeSet);

现在你有一个带有黑色光标的EditText视图。也许有人可以改进我的解决方案,以便可以在运行时更改光标。

答案 2 :(得分:15)

以下是我认为比@Adem发布的更好的解决方案。

爪哇:

try {
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

XML:

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

答案 3 :(得分:7)

使用AppCompat-v7的styles.xml怎么样?

<item name="colorControlNormal">@color/accentColor</item>
<item name="colorControlActivated">@color/accentColor</item>
<item name="colorControlHighlight">@color/accentColor</item>

适合我(这个例子很简单)。

答案 4 :(得分:7)

改善Jared Rummler的回答

爪哇:

try {
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

在res / drawable文件夹中创建custom_cursor.xml:

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

XML:

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textCursorDrawable="@drawable/custom_cursor"
     >
</EditText>

答案 5 :(得分:1)

您可以将android:textCursorDrawable属性设置为@null,这将导致使用android:textColor作为光标颜色。

属性textCursorDrawable在API级别12及更高版本中可用...

...谢谢

答案 6 :(得分:1)

所以,这里是最终版本 - 不需要XML并且以@null工作但是以编程方式工作:

   public void call(View v){

setContentView(R.layout.call);

Numbers num = new Numbers(cont);
 final Names names = new Names(cont);
   button = (Button) findViewById(R.id.name1);

   if(num.getNumber("1").isEmpty()) {
       button.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               setContentView(R.layout.activity_aseta_numero);
               Button button1 = (Button) findViewById(R.id.readyButton);


               button1.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View v) {
                       EditText text = (EditText) findViewById(R.id.Number);

                       Numbers j = new Numbers(cont);
                       j.setNumber(text.getText().toString(), "1");

                       EditText tex = (EditText) findViewById(R.id.NameField);

                       names.adName(tex.getText().toString(), "1");


                       button.setText(names.getNimi("1") + "moi");

                       setContentView(R.layout.call);
                       System.out.println(button.getText());


                   }
               });

           }
       });
   }else {




   }

唯一的问题是它可能会停止使用一些新版本的Android工作一天。

PS我在4.1.2到5.1测试了它。

答案 7 :(得分:1)

通过AppTheme设置

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:spinnerStyle">@style/spinner_style</item>
    <!--Add This-->
    <item name="editTextStyle">@style/EdittextStyle</item>
    <item name="android:dropDownListViewStyle">@style/SpinnerStyle</item>
</style>

<!--New EditText Style-->
<style name="EdittextStyle" parent="Widget.AppCompat.EditText">
    <item name="android:background">?attr/editTextBackground</item>
    <item name="android:textColor">?attr/editTextColor</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
    <!--<item name="android:textCursorDrawable">@drawable/abc_text_cursor_material</item>-->
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>

</style>

答案 8 :(得分:0)

使用您可以在下面使用代码

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:orientation="vertical"
    tools:context=".MainActivity"
    android:background="@color/grey"
    >
    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="input you name"
        android:padding="20dp"
        android:textColor="@color/black"
        android:textCursorDrawable="@null"
        />
    <EditText
        android:id="@+id/et_age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Input your age"
        android:padding="20dp"
        android:textCursorDrawable="@color/red"
        android:textColor="@color/black"
        />
</LinearLayout>

来自: change edittext cursor color android