如果我执行以下操作:
et_user_input.setKeyListener(DigitsKeyListener.getInstance("123-+"));
et_user_input.setInputType((EditorInfo.TYPE_TEXT_VARIATION_NORMAL));
设置inputType second会覆盖我指定的数字。这是一个非常令人头疼的问题,因为我使用的是自定义复合视图,我无法根据属性控制开关案例触发的顺序。
以下是我的代码的一小部分:
public ValidationEditText(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ValidationEditText);
int count = typedArray.getIndexCount();
for (int i = 0; i < count; i++) {
int attr = typedArray.getIndex(i);
switch (attr) {
case R.styleable.ValidationEditText_android_inputType:
LogUtil.a(getClass(), "Here1");
et_user_input.setInputType(typedArray.getInt(attr, EditorInfo.TYPE_TEXT_VARIATION_NORMAL));
break;
case R.styleable.ValidationEditText_android_digits:
LogUtil.a(getClass(), "Here2");
et_user_input.setKeyListener(DigitsKeyListener.getInstance(typedArray.getString(attr)));
break;
}
}
}
&#34; Here2&#34;总是首先触发&#34; Here1&#34;在交换机案例中。
这是&#34;覆盖&#34;影响Android的预期行为还是实际上是一个错误?
答案 0 :(得分:1)
找到解决方案,问题出在DigitsKeyListener扩展NumberKeyListener,返回数字inputType。所以解决方案是
public class CustomDigitsKeyListener extends NumberKeyListener {
private char[] mAccepted;
public CustomDigitsKeyListener(char[] mAccepted) {
this.mAccepted = mAccepted;
}
public CustomDigitsKeyListener() {
}
public static CustomDigitsKeyListener getInstance(String accepted){
CustomDigitsKeyListener cust = new CustomDigitsKeyListener();
cust.mAccepted = new char[accepted.length()];
accepted.getChars(0, accepted.length(), cust.mAccepted, 0);
return cust;
}
@Override
protected char[] getAcceptedChars() {
return mAccepted;
}
@Override
public int getInputType() {
return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
}
}