我试图为可以接受帝国价值的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