Android Kotlin-自定义视图未在设计编辑器中正确显示

时间:2018-07-30 06:17:16

标签: android kotlin

问题是这样的。我建立一个自定义的编辑文本视图。它具有一个textView和一个editText。

它是这样的:

enter image description here 这是管理自定义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。

有人知道为什么会这样吗?

谢谢大家!

1 个答案:

答案 0 :(得分:1)

最新答复。

这与您的@JvmOverloads有关。

您可以在此处了解更多信息:https://medium.com/@mmlodawski/https-medium-com-mmlodawski-do-not-always-trust-jvmoverloads-5251f1ad2cfe

我也试图创建一个自定义EditText并遇到相同的问题。我也在使用@JvmOverloads。阅读完本文后,我将其更改为Kotlin中的辅助构造函数,它立即开始工作。