问题是这样的。我建立一个自定义的编辑文本视图。它具有一个textView和一个editText。
它是这样的:
class CustomEditText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : ConstraintLayout(context,attrs, defStyle) {
init {
LayoutInflater.from(context).inflate(R.layout.custom_edit_text, this, true)
// Set invisible by default. This label will be shown if the user enter text into the EditText
CustomEditText_Title.visibility = View.INVISIBLE
CustomEditText_EditText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (count > 0) {
CustomEditText_Title.visibility = View.VISIBLE
} else {
CustomEditText_Title.visibility = View.INVISIBLE
}
}
})
attrs?.let {
val typedArray = context.obtainStyledAttributes(it, R.styleable.custom_edit_text_attributes, 0, 0)
val title = resources.getText(typedArray.getResourceId(R.styleable.custom_edit_text_attributes_custom_edit_text_title, R.string.custom_edittext_default_title))
val hint = resources.getText(typedArray.getResourceId(R.styleable.custom_edit_text_attributes_custom_edit_text_hint, R.string.custom_edittext_default_hint))
val input_type = resources.getText(typedArray.getResourceId(R.styleable.custom_edit_text_attributes_custom_edit_text_input_type, R.string.custom_edittext_input_type_text))
CustomEditText_Title.text = title
CustomEditText_EditText.hint = hint
when(input_type) {
"0" -> CustomEditText_EditText.inputType = InputType.TYPE_CLASS_TEXT
"1" -> CustomEditText_EditText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL
"2" -> CustomEditText_EditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
"3" -> {
CustomEditText_EditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
val typeface = ResourcesCompat.getFont(context, R.font.gothamrnd_book)
CustomEditText_EditText.typeface = typeface
}
}
}
}
}
在构造函数中,我采取了一种变通方法来设置editText的inputType。这是因为我无法弄清楚如何在可设置样式的属性中使用android:inputType(我尝试了许多不同的选项,但所有这些选项都会导致膨胀错误)。
问题是这样的:
我使用字符串来配置inputType:
when(input_type) {
"0" -> CustomEditText_EditText.inputType = InputType.TYPE_CLASS_TEXT
"1" -> CustomEditText_EditText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL
"2" -> CustomEditText_EditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
"3" -> {
CustomEditText_EditText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
val typeface = ResourcesCompat.getFont(context, R.font.gothamrnd_book)
CustomEditText_EditText.typeface = typeface
}
}
但是,如果选择“ 3”类型(在“设计”视图中为密码类型),则会显示错误。它使用所有屏幕,没有指定区域。 例如,如果我将其更改为文本类型,则显示为正确。
我正在使用Kotlin和最低SDK 21。
有人知道为什么会这样吗?
谢谢大家!
答案 0 :(得分:1)
最新答复。
这与您的@JvmOverloads
有关。
您可以在此处了解更多信息:https://medium.com/@mmlodawski/https-medium-com-mmlodawski-do-not-always-trust-jvmoverloads-5251f1ad2cfe
我也试图创建一个自定义EditText并遇到相同的问题。我也在使用@JvmOverloads
。阅读完本文后,我将其更改为Kotlin中的辅助构造函数,它立即开始工作。