【问题标题】:View extending EditText loses Styles and is not focusable视图扩展 EditText 丢失样式并且不可聚焦
【发布时间】:2017-09-24 15:37:17
【问题描述】:

出于方便的原因(NumberEdit),我尝试使用 kotlin 将 EditText 子类化,但渲染的 View 丢失了大部分 EditText 属性。外观是 TextView 的外观,并且不能用鼠标聚焦(在模拟器中)。当我单击活动时,我可以编辑第一个 NumberEdit 小部件,并可以使用 tab 键循环到下一个。

我添加了两个模拟器屏幕截图来说明差异。

一个 EditText 看起来像这样

新的 NumberEdit 看起来像这样

扩展类如下所示:

import android.content.Context
import android.text.InputType
import android.util.AttributeSet
import android.widget.EditText


class EditNumber(context: Context, attributeSet: AttributeSet?, defStyleAttr: Int, defStyleRes: Int)
    : EditText(context, attributeSet, defStyleAttr, defStyleRes) {

    constructor(context: Context) : this(context, null, 0, 0)
    constructor(context: Context, attributeSet: AttributeSet?) : this(context, attributeSet, 0, 0)
    constructor(context: Context, attributeSet: AttributeSet?, defStyleAttr: Int)
        : this(context, attributeSet, defStyleAttr, 0)

    init {
        inputType = InputType.TYPE_CLASS_NUMBER + InputType.TYPE_NUMBER_FLAG_DECIMAL
    }
}

有人知道我做错了什么吗?我必须明确引用某些属性吗?

【问题讨论】:

    标签: android android-layout android-edittext


    【解决方案1】:

    我不是 kotlin 专家,但如果您查看 edittext 的 java 源代码,您会发现:

    public class EditText extends TextView {
        public EditText(Context context) {
            this(context, null);
        }
        public EditText(Context context, AttributeSet attrs) {
            this(context, attrs, com.android.internal.R.attr.editTextStyle);
        }
        public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
            this(context, attrs, defStyleAttr, 0);
        }
        public EditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    

    您似乎没有将正确的参数传递给构造函数...您传递了很多 0 和空值...

    【讨论】:

    • 是的,在 kotlin 中,所有构造函数都必须调用类的主构造函数,它在类签名中声明。由于其他构造函数没有设置主构造函数所需的所有参数,因此我必须传递 null/0。 EditText 构造函数的作用相同,但有一个区别,两个 arg 构造函数传递硬编码的 editTextStyle Id。我认为这是我的问题。今天晚些时候会试一试。感谢您的提示!
    • 是的,解决了。唯一的区别是 com.android.internal.R 无法解析,但使用 android.R 似乎也可以。
    • @Candlejack 很高兴我能帮上忙。
    【解决方案2】:

    在 Kotlin 中你可以写得更简洁:

    class EditNumber @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyle: Int = R.attr.editTextStyle,
        defStyleRes: Int = 0
    ) : EditText(context, attrs, defStyle, defStyleRes)
    

    注意defStyle 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多