为了方便起见,我尝试使用kotlin对EditText进行子类化(NumberEdit),但渲染的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
}
}
有没有人知道我做错了什么?我是否必须明确引用某些属性?
答案 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
参数。