无法更改自定义 EditText 类中的背景图像

问题描述

我有一个自定义 EditTextClass 用于我的应用程序上的所有 EditTexts -

implementation 'com.afollestad.material-dialogs:core:3.3.0'

我想更改背景图片,以便它应该反映在此 CustomEditText 的所有用法中。

我试过了 -

Class CustomEditText : EditText {
...
}

还有这个 -

override fun onDraw(canvas: Canvas ? ) {
    val d = AppCompatResources.getDrawable(mContext!!,R.drawable.new_drawable)
    d?.draw(canvas!!)
    super.onDraw(canvas)
}

这两种方法都行不通。谁能告诉我正确的解决方案是什么?

解决方法

drawable 时需要 setBoundsdrawable
所以你应该像这样制作你的draw方法。

override fun onDraw(canvas: Canvas? ) {
    val d = AppCompatResources.getDrawable(context!!,R.drawable.new_drawable)
    d?.setBounds(0,width,height)
    d?.draw(canvas!!)
    super.onDraw(canvas)
}
,

首先绘制到 canvas 并将 canvas 传递给 parent,这意味着 super.onDraw 应该在底部

override fun onDraw(canvas: Canvas ? ) {
    val d = AppCompatResources.getDrawable(mContext!!,R.drawable.new_drawable)
    d?.draw(canvas!!)
    super.onDraw(canvas)
}
,

在我看来,您应该不要覆盖 onDraw 方法,因为在您的操作之前调用 super.onDraw(canvas) 时这可能会导致问题(您的 drawable 可能会覆盖文本、点击、可绘制元素等)。

我制作了一个对我有用的演示:

class CustomEditText : AppCompatEditText {
    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() {
        setBackgroundResource(R.drawable.new_drawable)
    }
}