如何在Android editText中进行分数。输入过滤器?自定义IME?

时间:2014-05-26 13:16:15

标签: android android-edittext ime android-inputtype input-filter

我试图为可以接受帝国价值的editText编写代码{即。 1,3 / 4,1 / 3}。到目前为止,在StackOverflow的帮助下,我已经将它钉上了。但是缺少三件事。

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

这些都没有显示我需要输入数据的/键,而QWERTY键盘对于单个按键来说太麻烦了。令我惊讶的是,没有键盘可以做到这一点,那么猛拉有什么作用呢?我可以覆盖和替换股票键盘上的单个键吗,我是否必须为这个看似简单的任务实现自己的键盘?

我也在努力防止第一个角色成为空格或/的逻辑。我可以允许给定字符串中的每一个没问题,我只是不能阻止它成为第一个键。此外,当您输入一个值 - 例如" 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上的代码:

public float testImperialString(String 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:DR

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

0 个答案:

没有答案