拔号界面显示阿拉伯数字

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));

.........

........

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值