当EditText的gravity设置为end或者right时,在某些手机上输入框的光标位置会显示在hint文字之前,如下图:
如果我们想光标的位置在hint文字后面,即最右边,解决的方法有:
方法一:比较省事的做法,设置EditText的textCursorDrawable属性为空:
android:textCursorDrawable="@null"
效果如下图,光标位置在最后面了。
如果对这个显示效果(光标有点细)不太满意,则应该采用方法二。
方法二:把hint文字清除掉,当hint为空,光标就会在EditeText的末尾了。当然了,没hint是不行的,所以我们还需要把之前的hint给draw上去。代码如下:
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatEditText
class CursorEditText : AppCompatEditText {
private lateinit var mHintText: CharSequence
private lateinit var mHintTextPaint: Paint
private lateinit var mFontMetricsInt: Paint.FontMetricsInt
constructor(context: Context) : super(context) {
init()
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
init()
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
init()
}
private fun init() {
mHintTextPaint = Paint().apply {
isAntiAlias = true
textSize = this@CursorEditText.textSize
textAlign = Paint.Align.RIGHT
color = currentHintTextColor
mFontMetricsInt = fontMetricsInt
}
mHintText = hint ?: ""
//clear original hint text
hint = null
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
if (mHintText.isEmpty() || !text.isNullOrEmpty()) {
return
}
//draw hint text
val textBaseline =
(height - mFontMetricsInt.bottom + mFontMetricsInt.top) / 2f - mFontMetricsInt.top
canvas.drawText(
mHintText, 0, mHintText.length,
(width - paddingEnd + scrollX).toFloat(), textBaseline, mHintTextPaint
)
}
}
显示效果如下:
如果有需要动态setHint()或者setTextColorHint()的,则重新赋值mHintText和mHintTextPaint的color,然后invalidate()刷新。扩展代码就不写了。
方法二代码部分来自:naturs/FixedCursorEditText.java
方法三:动态设置文本的显示方向。
具体实现参照此篇文章→Android EditText内容右对齐,光标位于hint之后
如果方法三无效,在AndroidManifest中,把application的supportsRtl设置为true试试。
<application
......
android:supportsRtl="true"
......
>
</application>