我正在尝试为可以接受英制值 { 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:博士
- 我需要一个带有 / 符号的数字键盘
- 我需要防止空格或 / 作为输入的第一个字母
- 如果字符串中的先前出现被删除,我需要重新允许空格或 / 输入。