我有一个自定义的EditTextClass,我使用的所有edittext在我的应用程序-
Class CustomEditText : EditText {
...
}
我想改变背景图像,这样它应该反映在这个CustomEditText的所有用法。
I tried this -
override fun onDraw(canvas: Canvas ? ) {
val d = AppCompatResources.getDrawable(mContext!!, R.drawable.new_drawable)
d?.draw(canvas!!)
super.onDraw(canvas)
}
and this -
fun init(context: Context ? , attrs : AttributeSet ? ) {
background = ResourcesCompat.getDrawable(context!!.getResources(), R.drawable.new_drawable, null)
setBackground(background)
}
两种方法都不行。谁能告诉我正确的解决办法是什么?
绘制时需要将setBounds
改为drawable
。
你应该让你的draw方法像这样
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)
}
首先绘制到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)
}
}