2

我正在尝试为可以接受英制值 { ie. 1、3/4、1 1/3}。到目前为止,在 StackOverflow 的大力帮助下,我已经搞定了。但是缺少三件事。

android:inputType="number" or numberSigned, numberDecimal, phone etc

这些都没有显示我需要输入数据的 / 键,而且 QWERTY 键盘对于单个按键来说太麻烦了。我很惊讶没有这个键盘,yanks 是做什么的?我可以覆盖和替换普通键盘上的单个键吗?我是否必须为这个看似简单的任务实现自己的键盘?

我也在努力避免第一个字符是空格或 / 的逻辑。我可以允许给定字符串中的每一个都没有问题,我只是不能阻止它成为第一个键。此外,当您输入一个值(例如“1 5/9”)时,如果您退格到 /,则不会重置标志,因此禁止您输入另一个 /。

InputFilter 的代码如下:

imperial_filter = new InputFilter() {

        boolean canEnterSpace = true, canEnterSlash = true;
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            if (imperial_editText.getText().toString().equals("")) {

                canEnterSpace = true;
                canEnterSlash = true;

            }

            StringBuilder builder = new StringBuilder();

            for (int i = start; i < end; i++) {

                char currentChar = source.charAt(i);

                if (Character.isDigit(currentChar) || (Character.isWhitespace(currentChar) && canEnterSpace && canEnterSlash) || (currentChar == '/' && canEnterSlash)) {

                    builder.append(currentChar);

                    if (Character.isWhitespace(currentChar)) canEnterSpace = false;
                    if (currentChar == '/') canEnterSlash = false;

                }

            }

            return builder.toString();

        }

    };

这个有点复杂,稍微改编自 StackOverflow 上的代码:

公共浮动 testImperialString(字符串 testString){

    boolean goodInput = true, goodInputSpace = true, containsSpace = false;

    float result = 0, whole = 0;
    String fractions = "";

    if (testString.contains(" ")) {

        containsSpace = true;
        String pieces[] = testString.split(" ");

        try {

            whole = Float.parseFloat(pieces[0]);
            fractions = pieces[1];

        } catch (Exception e) {

            goodInputSpace = false;

        }

    } else fractions = testString;

    if (fractions.contains("/")) {

        //possible division
        String pieces[] = fractions.split("/");

        if (pieces.length != 2) {

            goodInput = false;

        } else {

            try {

                float numerator = Float.parseFloat(pieces[0]);
                float denominator = Float.parseFloat(pieces[1]);
                result = numerator / denominator;

            } catch (Exception e) {

                goodInput = false;

            }

        }

    }

    if (!testString.contains(" ") && !(result > 0)) {

        try {

            result = Float.parseFloat(testString);

        } catch (Exception e) {

            goodInput = false;

        }

    }

    Log.d(TAG, "Contains Space = " + containsSpace + " Good Input = " + goodInput + " Good InputSpace = " + goodInputSpace);

    return whole + result;

}

我通过一种将英制测量值转换为公制等效值的方法运行该结果,我可以使用该方法执行数学函数。

TL:博士

  1. 我需要一个带有 / 符号的数字键盘
  2. 我需要防止空格或 / 作为输入的第一个字母
  3. 如果字符串中的先前出现被删除,我需要重新允许空格或 / 输入。
4

0 回答 0