Anko自定义小部件:editText而不显示错误文本

时间:2019-05-07 23:16:41

标签: kotlin android-edittext anko

我尝试使MyEditText扩展EditText类,而仅进行一项更改: 不显示错误的“工具提示”。当editText.error =“ some error”时仅显示图标(!)

class MyEditText : EditText {

    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 setError(error: CharSequence, icon: Drawable) {
        setCompoundDrawables(null, null, icon, null)
    }
}

在Anko DSL中使用时

editText {
id = editNameId
}

在代码中,我尝试过强制转换:

private lateinit var editName: MyEditText

editName = find<MyEditText>(editNameId)
// or other variants
// editName = find<EditText>(editNameId)
// editName = find<EditText>(editNameId) as MyEditText

我遇到了无法将EditText转换为MyEditText的错误。 如果我理解正确,则需要为Anko制作自己的小部件标签。

myEditText {
id = editNameId
}

我发现该代码应与以下代码类似:

inline fun ViewManager.myEditText() = myEditText {}
inline fun ViewManager.myEditText(theme: Int = 0, init: MyEditText.() -> Unit) = ankoView({MyEditText(it)}, theme, init)

这不起作用,因为我不知道如何将两个参数传递给构造函数:context和attrs。

我已经考虑了很长时间了,但是我解决不了; /

谢谢您的时间。

2 个答案:

答案 0 :(得分:1)

我相信您希望使View类可以从DSL访问,然后显式创建它。

将此代码添加到包含自定义视图类的文件中:

inline fun ViewManager.myEditText(init: MyEditText.() -> Unit): MyEditText {
    return ankoView({ MyEditText(it) }, theme = 0, init = init)
}

然后,您可以在anko DSL中使用以下内容:     myEditText {id = editNameId}

另一个建议的更改是不使用视图ID,而只是从DSL中分配一个变量:

verticalLayout {
  editName = myEditText {}
}

答案 1 :(得分:0)

我提出了最终解决方案:

在extension.kt

class MyEditText : EditText {

var isError = true
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 setError(error: CharSequence?, icon: Drawable?) {
    setCompoundDrawables(null, null, icon, null)
    isError = error != null
} }

inline fun ViewManager.myEditText(theme: Int = 0, init: MyEditText.() -> Unit) = ankoView({MyEditText(it)}, theme, init)

在Anko DSL类中(etName在伴随对象中定义)

myEditText {
   id = etName                
}

活动中

private lateinit var enterName: MyEditText
[..]
override fun onCreate [...]
{

enterName = find(etName)

 if (enterName.text.isNotEmpty()) enterName.error = null else enterName.error = "error"

 enterName.addTextChangedListener(object : TextWatcher {
     override fun afterTextChanged(s: Editable?) {
     if (s!!.isNotEmpty()) enterName.error = null else enterName.error = "error"
     validateForm()
     }

     override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
     override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
  })

validateForm()
// rest of onCreate
}

private fun validateForm() {
  editButton.isEnabled = enterName.isError == false
}