第一行EditText自定义光标绘制不正确

3

我的主要布局中有一个EditText。我还有一个应用程序主题,其中默认的edittext使用自定义curdordrawable进行样式化。

<EditText
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/introEditText"
     android:gravity="top"
     android:singleLine="false"
     android:text=""
     android:inputType="textMultiLine"
     android:textSize="24sp" >
       <requestFocus/>
</EditText>

<style name="AppTheme" parent="android:Theme.Holo.NoActionBar">
    <item name="android:textColor">#ffffff</item>
    ...
    <item name="android:editTextStyle">@style/EditTextStyle</item>
</style>


<style name="EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@android:color/transparent</item>
    <item name="android:textCursorDrawable">@drawable/cursor</item>
</style>

我的自定义光标是:

<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <size android:width="2dp" />
    <solid android:color="#363636"  />
</shape>

光标颜色正确,但宽度不正确。在第一行中,其宽度为1像素而不是2dp。当文本换行时,光标变为2dp宽。此外,在edittext没有文本时不显示。我在4.4上进行了测试(HTC One和Nexus 7)。这是Android的一个bug吗?


为EditText设置android:hint属性而不是android:text属性,并删除<requestFocus/>标签。 - Chandru
它不会改变任何东西(也没有),因为问题出现在输入时。删除requestfocus同样无法改变任何东西。 - azyoot
嗯,在4.4三星设备上检查过了 - 没有观察到这个问题。你在模拟器上观察到这个问题了吗? - sandrstar
很遗憾,我无法在模拟器上测试这个。 - azyoot
2个回答

4
实际上,随着EditText宽度的增加,光标的大小被一些空间屏蔽了(无法确定是什么)。因此,解决方法是修复EditText的宽度。
<EditText
 android:layout_width="wrap_content"
 android:layout_height="match_parent"
 android:id="@+id/introEditText"
 android:gravity="top"
 android:singleLine="false"
 android:text=""
 android:inputType="textMultiLine"
 android:textSize="24" />

如果您想要精确的宽度,请使用em,如下所示:
<EditText android:ems="10" ...
/>

android:ems会在文本大小为12sp时,将TextView的宽度设置为适合n个'M'字母的宽度。我认为这是无法避免的。

谢谢,它可以工作!然而,这是相当奇怪的行为。我很乐意看到一些官方意见或确切的原因。 - azyoot

1

这在模拟器中对我有效。像您已经做过的那样,在drawable中创建一个xml文件:

edit_text_cursor.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size android:width="2dip"/>
    <solid android:color="#00AAEE"/>
</shape> 

然后在您的布局中按以下方式创建它:
<EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:singleLine="false"
        android:textCursorDrawable="@drawable/edit_text_cursor"
        android:ems="10"
        android:inputType="textMultiLine" />

这个修复了第一个像素光标的问题。(我已经测试过):
android:ems="10"

这应该足够了,但如果你在光标为空时有显示问题,你可以添加以下内容到EditText以强制它:

 android:cursorVisible="true"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接