无法在 EditText 文本下方绘制形状矩形、路径...

Cannot draw shapes Rectangles, Paths... below EditText text

我想在 TextView 和 EditText 的文本值下方绘制矩形、圆形、路径、三角形等形状。因此,我覆盖了 onDraw() 方法,并在将背景颜色设置为绿色后绘制简单的蓝色矩形来对其进行测试。我知道我不应该在 onDraw() 方法中初始化对象(Paint 对象),但它仅用于测试。以下是完整代码:

class Test : AppCompatEditText {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
 
    override fun onDraw(canvas: Canvas) {
        setBackgroundColor(Color.GREEN)
 
        canvas.drawRect(0f, 0f, 150f, 50f, Paint().apply {
            isAntiAlias = true
            color = Color.BLUE
            style = Paint.Style.FILL
        })

        super.onDraw(canvas)
    }
}

然后使用xml

初始化它
 <com.slaviboy.galaxy.Test
     android:id="@+id/ssss"
     android:layout_width="150dp"
     android:layout_height="50dp"
     android:gravity="center"
     android:text="TEST"
     android:imeOptions="actionDone"
     android:inputType="number"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent" />

这是最终结果

上次我使用类似的代码我记得它特别适用于 EditText!

  1. 我在所有视图下方使用 GLSurfaceView 绘制了一个 OpenGL 场景,所以我认为这是造成它的原因,所以我删除了它,但问题仍然存在。
  2. 然后我将类型从 EditText 更改为简单 View,它开始按预期工作。所以它表明这是仅当我使用EditText和TextView时出现的问题。
  3. 所以我开始从 xml 初始化中删除属性,特别是属性 inputType

因此,一旦我删除了 inputType 属性,代码就会按预期开始工作,

android:inputType="number"

知道为什么会导致视图丢失所有绘图吗? 是否有解决方法?

我知道我可以使用属性 digits 来限制允许的字母,但是有没有办法将键盘样式保持为数字?

android:digits="0123456789."

您遇到的问题与以下问题有关:。您可以通读已接受的答案,但最重要的是 TextView 内部滚动已关闭,因此即使您正在绘图,它也会滚出视图。快速解决方案是将水平滚动设置为 false.

class MyEditText : androidx.appcompat.widget.AppCompatEditText{
    ...
    init {
        setHorizontallyScrolling(false)
    }
    ...
}

这样做可能会产生意想不到的后果,但是,如果 TextView 没有做任何花哨的事情,我想你会没事的。答案中还提到了其他修复,例如捕获滚动和向后滚动可能更安全。