【问题标题】:Crashing NumberPicker, changed keyboard typeNumberPicker 崩溃,更改了键盘类型
【发布时间】:2018-01-19 05:30:16
【问题描述】:

当我在输入第一个数字时将 numberPicker 上的键盘类型更改为“TYPE_CLASS_NUMBER”时,我的 android 应用程序一直在跳动。在不指定键盘类型的情况下同样有效。所以看来键盘变化是问题所在。 代码如下:

public void chooseAmps(View view) {
    final NumberPicker numberPicker = new NumberPicker(this);
    NumberPicker.Formatter formatter = new PickerFormatter();
    //numberPicker.setFormatter(formatter);
    numberPicker.setMinValue(0);
    numberPicker.setMaxValue(100);
    numberPicker.setDisplayedValues(getStringArray(0, 10));
    enableNumberPickerManualEditing(numberPicker);


    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.AmpsMessage)
            .setTitle(R.string.AmpsTitle)
            .setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Log.d("UI", String.valueOf(numberPicker.getValue()));
                    double currentDesired = numberPicker.getValue() / 10.0;
                    charger.setCurrentDesired(currentDesired);
                    Log.d("UI", String.valueOf(charger.getCurrentDesired()));
                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .setView(numberPicker);
    AlertDialog dialog = builder.create();
    dialog.show();
}

String[] getStringArray(double begin, double end) {
    String[] stringArray = new String[(int) ((end - begin) * 10)+1];
    double number = begin;
    for (int i = 0; i < (int) ((end - begin) * 10+1); i++) {
        stringArray[i] = String.format("%.1f", number);
        number += 0.1;
    }
    Log.d("UI", String.valueOf(number));
    return stringArray;
}

public static void enableNumberPickerManualEditing(NumberPicker numPicker) {
    int childCount = numPicker.getChildCount();

    for (int i = 0; i < childCount; i++) {
        View childView = numPicker.getChildAt(i);

        if (childView instanceof EditText) {
            EditText editText = (EditText) childView;
            editText.setInputType(InputType.TYPE_CLASS_NUMBER);
            return;
        }
    }
}

}

这里的崩溃消息:

"进程:com.jacobi.mario.charger,PID:28169 java.lang.IndexOutOfBoundsException: setSpan (3 ... 3) 结束 长度 2 在 android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1320) 在 android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:683) 在 android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:676) 在 android.text.Selection.setSelection(Selection.java:78) 在 android.widget.EditText.setSelection(EditText.java:96) 在 android.widget.NumberPicker$SetSelectionCommand.run(NumberPicker.java:2278) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6236) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)"

有人给我小费吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    哇,我刚刚找到了一个解决方案,但也许有更好的解决方案?

    对我来说,它改变了: editText.setInputType(InputType.TYPE_CLASS_NUMBER); 到 editText.setRawInputType(InputType.TYPE_CLASS_NUMBER);

    【讨论】:

    • 遇到了同样的问题。将尝试此解决方案,但这需要时间,因为如果崩溃报告消失,我必须等待...
    • 至少在 Android 11 上,此更改会导致数字输入键盘的行为有所不同。它允许许多其他字符,甚至换行符,所以它不适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多