【问题标题】:Cannot draw shapes Rectangles, Paths... below EditText text无法在 EditText 文本下方绘制形状矩形、路径...
【发布时间】:2021-10-30 12:19:30
【问题描述】:

我想在 TextView 和 EditText 的文本值下方绘制形状 Rectangles、Circle、Paths、Triangles。所以我重写了 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."

【问题讨论】:

    标签: java android kotlin android-edittext


    【解决方案1】:

    您遇到的问题与此问题有关:Cannot draw on Chip when text alignment is center。您可以通读已接受的答案,但底线是 TextView 内部滚动已关闭,因此即使您正在绘制,它也会滚动到视野之外。快速解决方案是将水平滚动设置为false

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

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

    【讨论】:

    • 谢谢,我已经测试过了,它可以工作!但我找到了更好的解决方案,我设置了属性 android:digits="0123456789.-" 并修复了它,你可以测试一下!但我会批准你的承诺。
    • 感谢您的接受和点赞。您更简单的解决方案适用于您的情况,但一般问题是滚动不良。此答案将适用于问题也表现出来的其他inputTypes 以及“数字”inputType - 仅供将来参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多