我尝试使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。
我已经考虑了很长时间了,但是我解决不了; /
谢谢您的时间。
答案 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
}