如何以编程方式更改EditText's
光标的颜色?
在Android 4.0及更高版本中,光标颜色为白色。如果EditText
的背景也是白色,则它变得不可见。
答案 0 :(得分:115)
在EditText属性中,有一个属性android:textCursorDrawable
现在将其设置为 @null ,例如
android:textCursorDrawable="@null"
现在,您的EditText光标与EditText TextColor相同。
答案 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>