安卓“android:inputType”在设置“android:digits”之后会覆盖它(是个bug吗?)

3
如果我执行以下操作:
et_user_input.setKeyListener(DigitsKeyListener.getInstance("123-+"));
et_user_input.setInputType((EditorInfo.TYPE_TEXT_VARIATION_NORMAL));

设置inputType第二个参数会覆盖我指定的数字。这很让人头疼,因为我正在使用自定义复合视图,无法控制基于属性时开关案例触发的顺序。

下面是我的一小段代码:

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

        }
}

在switch case语句中,“Here2”总是先触发,然后才是“Here1”。这种“覆盖”的效果是Android期望的行为,还是实际上存在一个bug?

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,