我正在尝试使用大量行间距创建Edittext
。它正在工作,但光标不在正确的位置。看下面的图片。如您所见,光标位于两行之间。
这是Edittext代码: -
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:fadingEdge="vertical"
android:gravity="left|center_vertical"
android:lineSpacingExtra="10dp"
android:lineSpacingMultiplier="2"
android:padding="18dp"
android:scrollbars="vertical"
android:textSize="22sp" >
<requestFocus />
</EditText>
答案 0 :(得分:1)
答案你必须使用android:textCursorDrawable =“@ drawable / name_of_your_drawable”并设置你自己的光标和填充你应该设置android:bottom =“ - 20sp”(或你的文字大小)的值。举个例子。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.androisxxxsxsxd.com/apk/res/android"
android:shape="rectangle" >
<size
android:width="2dip" />
<solid
android:color="@color/red" />
<padding
android:top="2sp"
android:bottom="-20sp" />
</shape>
myxml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:paddingTop="18dp"
android:gravity="left|center_vertical"
android:lineSpacingExtra="20dp"
android:textCursorDrawable="@drawable/d"
android:text="test"
/>
答案 1 :(得分:1)
如果您将textCursorDrawble
与lineSpacingExtra
一起使用,还有另一个问题:当您的应用在Lollipop上方运行时,因为最后一行的线路高度不会改变,如果您在自定义textCursorDrawable
中定义了负底部填充,则光标将在最后一行缩小,如下所示:
为了获得更加生动的效果,我将lineSpacingExtra
设置为8dp
,我的自定义textCursorDrawable
的一部分为<padding android:bottom="-8dp"/>
。因此,您可以看到最后一行显示的小光标。
当然,我们不喜欢这样。我在互联网上搜索了几个小时和几天,但没有页面帮助。但是如果你看到这个答案就不要担心,因为我已经按照自己的方式解决了这个问题,这有点骇人听闻,但就我所知而言效果很好。
我们问题的根本原因是我们为textCursorDrawable
设置了底部填充,使所有行更短。让我们说文本大小是12dp,那么原始行高也是12dp(只是让事情更简单)。定义lineSpacingExtra="8dp"
后,行高将增加到20dp。如果我们不对textCursorDrawable
做任何事情,光标高度现在也将是20dp,显然比文字大小长,因此我们缩短它,通过定义<padding android:bottom="-8dp"/>
来缩小底部8dp自定义textCursorDrawable
形状xml文件。但是,在Lollipop之上,最后一行忽略lineSpacingExtra
,因此它的行高保持在12dp。如果我们不使用自定义光标,那么最后一行的光标也是如此。然后我们削减8dp,现在我们看到一个4dp光标,这是错误的,而正确的操作是停止在自定义textCursorDrawable
中设置-8dp底部填充。
所以解决方法是:对正常行和最后一行使用不同的textCursorDrawable
,显示对特殊行的足够尊重。
然后,我们何时应该更改textCursorDrawable
?我的回答是:当用户点击EditText
的最后一行时。这是合理的,因为光标只能在此操作之后出现(如果用户点击&#34,则可能不是最后一次操作;在此之后输入&#34;但这并不会影响我们的解决方案。)
下一步是倾听用户点击最后一行。我的解决方案很粗糙:
mEditText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
EditText et = (EditText) v;
// lineSpacingExtra's unit is px.
int lastLineHeight = (int) (et.getLineHeight() - et.getLineSpacingExtra());
if (et.getHeight() - event.getY() <= lastLineHeight) {
setTextCursorDrawable(et, lastLineCursorRes);
} else {
setTextCursorDrawable(et, normalCursorRes);
}
return true;
}
return false;
}
});
这是setTextCursorDrawable
的优雅(但我们必须)实现:
public void setTextCursorDrawable(EditText et, @DrawableRes int res) {
try {
Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
f.setAccessible(true);
f.set(et, res);
} catch (Exception ignored) {}
}
最后,lastLineCursorRes
的特殊部分:
<强> <padding android:bottom="0dp"/>
强>
<强>参考强>
要知道lineSpacingExtra/Multiplier
及其子类的最后一行忽略TextView
的原因,请检查:How LineSpace Affects StaticLayout Height in One Line Text,Android TextView 行间距解析(in Chinese)和StaticLayout源码解析(in Chinese)。