mtk 6580 android 5.1 /6.0
在阿拉伯文下,拔号盘的数字显示成了阿拉伯,但输出显示的还是数字。在DialpadFragment.java里面,对输入的数字做了监听
mDigits.setKeyListener(UnicodeDialerKeyListener.INSTANCE); 所以要从这里入手。可以看到UnicodeDialerKeyListener.java的代码如下
public class UnicodeDialerKeyListener extends DialerKeyListener {
public static final UnicodeDialerKeyListener INSTANCE = new UnicodeDialerKeyListener();
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
final String converted = PhoneNumberUtils.convertKeypadLettersToDigits(
PhoneNumberUtils.replaceUnicodeDigits(source.toString()));
CharSequence result = super.filter(converted, start, end, dest, dstart, dend);
if (result == null) {
if (source.equals(converted)) {
return null;
} else {
return converted.subSequence(start, end);
}
}
return result;
}
}
号码在这里被格式化了 PhoneNumberUtils.replaceUnicodeDigits(source.toString()),所以这里不能再使用这个方法。由于source.toString()是0至9的数字,只需要把source.toString()转换成阿拉伯数字即可,可用这个方法(注:此方法来自网络,亲测可用):
private String onTextChangedForArabic(CharSequence input){
String mDigitsNum = input.toString();
String localNum;
char[] arabicChars = {'٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'};
StringBuilder builder = new StringBuilder();
for (int i = 0; i < mDigitsNum.length(); i++) {
if (Character.isDigit(mDigitsNum.charAt(i))) {
builder.append(arabicChars[(int) (mDigitsNum.charAt(i)) - 48]);
} else {
builder.append(mDigitsNum.charAt(i));
}
}
return builder.toString();
}
这样返回的就是阿拉伯文的数字了。将UnicodeDialerKeyListener.java的代码改一下,只有一行
final String converted = PhoneNumberUtils.convertKeypadLettersToDigits(onTextChangedForArabic(source));
这样即可。
同时需要注意的是,也要把阿拉伯文的数字加入到framework的DialerKeyListener.java中,因为默认这里面是没有阿拉伯文的,否则按键的时候,什么都不会输出。
DialerKeyListener.java 中的CHARACTERS 数组加入阿拉伯文
public static final char[] CHARACTERS = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '#', '*',
'+', '-', '(', ')', ',', '/', 'N', '.', ' ', ';', 'P', 'W', 'p', 'w',
'٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'
};
大功告成!
最后注意一下的是,UnicodeDialerKeyListener.java的filter方法, 在5.1上只会执行一次,而6.0上则会执行两次,不明白为什么。所以需要对6.0上的代码在转换的时候判断source.toString()是否已经转换成,不然执行onTextChangedForArabic的时候,会提示数组越界。
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
if(source.toString().contains("٠") || source.toString().contains("١") || source.toString().contains("٢")|| source.toString().contains("٣")|| source.toString().contains("٤")
|| source.toString().contains("٥")|| source.toString().contains("٦")|| source.toString().contains("٧")|| source.toString().contains("٨")|| source.toString().contains("٩") ){
return null;
}
final String converted = PhoneNumberUtils.convertKeypadLettersToDigits(onTextChangedForArabic(source));
.........
........
}