查看扩展的EditText会丢失样式并且无法调焦

时间:2017-09-24 15:37:17

标签: android android-layout android-edittext

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

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

EditText看起来像这样

An EditText looks like this

新的NumberEdit看起来像这样

The new NumberEdit looks like this

扩展类看起来像这样:

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
    }
}

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

2 个答案:

答案 0 :(得分:3)

我不是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和null ...

答案 1 :(得分:0)

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

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

注意 defStyle 参数。