无法更改自定义 EditText 中的背景图片 class

Unable to change background image in custom EditText class

我有一个自定义 EditTextClass,我将其用于我应用程序上的所有 EditText -

Class CustomEditText : EditText {
...
}

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

我试过了 -

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

还有这个-

fun init(context: Context ? , attrs : AttributeSet ? ) {
    background = ResourcesCompat.getDrawable(context!!.getResources(), R.drawable.new_drawable, null)
    setBackground(background)
}

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

首先绘制到 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)
}

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

override fun onDraw(canvas: Canvas? ) {
    val d = AppCompatResources.getDrawable(context!!, R.drawable.new_drawable)
    d?.setBounds(0, 0, width, height)
    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)
    }
}