Android解决EditeText内容右对齐时光标位于hint之前的问题

2023-10-29

当EditText的gravity设置为end或者right时,在某些手机上输入框的光标位置会显示在hint文字之前,如下图:

img

如果我们想光标的位置在hint文字后面,即最右边,解决的方法有:

方法一:比较省事的做法,设置EditText的textCursorDrawable属性为空:

android:textCursorDrawable="@null"

效果如下图,光标位置在最后面了。

img

如果对这个显示效果(光标有点细)不太满意,则应该采用方法二。

方法二:把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
        )
    }
}

显示效果如下:

img

如果有需要动态setHint()或者setTextColorHint()的,则重新赋值mHintText和mHintTextPaint的color,然后invalidate()刷新。扩展代码就不写了。

方法二代码部分来自:naturs/FixedCursorEditText.java

方法三:动态设置文本的显示方向。

具体实现参照此篇文章→Android EditText内容右对齐,光标位于hint之后

如果方法三无效,在AndroidManifest中,把application的supportsRtl设置为true试试。

<application
    ......
    android:supportsRtl="true"
    ......
    >
</application>
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android解决EditeText内容右对齐时光标位于hint之前的问题 的相关文章

随机推荐