使用TransformationMethod接口

最近要写一个小程序,要在TextView里面显示中文,可是出现好多小方格,出现这种情况的原因是TextView并不支持这些字符。

这有可以分成两种情况,一是字库里不包含的字,通常是一些特别冷僻的字。这种对我们写程序来说是无能为力的,只能靠用户自己去更新系统的字库。第二种情况是有一些特殊的字符,比如'\r'(回车),TextView不能识别。所以解决办法就是把它过滤掉。

这里提供两种方法:

一种很容易想到,就是一个一个字符去比较,等于'\r'就delete掉。

view plaincopy to clipboardprint?
String str;  
StringBuffer buf = new StringBuffer(str);  
for(int i=0;i<buf.length();i++)  
    if(buf.charAt(i) == '\r')  
        buf = buf.deleteCharAt(i);  
str = buf.toString(); 
String str;
StringBuffer buf = new StringBuffer(str);
for(int i=0;i<buf.length();i++)
    if(buf.charAt(i) == '\r')
        buf = buf.deleteCharAt(i);
str = buf.toString();

还有一种方法是用TextView 的setTransformationMethod(TransformationMethod method)把所有字库不支持的char都过滤掉。

TransformationMethod只是一个接口,如果要实现替换操作,最方便的做法是继承抽象类 ReplacementTransformationMethod,ReplacementTransformationMethod实现了 TransformationMethod的方法,并提供了两个抽象函数。getOriginal()返回的是需要被替换的 char[],getReplacement()返回的是替换后的char[]。

这里我用空格替换回车,3替换2,注意它们是一一对应的。

view plaincopy to clipboardprint?
private class MyTransformationMethod extends ReplacementTransformationMethod{  
        @Override 
        protected char[] getOriginal() {  
            char[] original={'\r','2'};  
            return original;  
        }  
        @Override 
        protected char[] getReplacement() {         
            char[] replacement={' ','3'};  
            return replacement;  
        }  
         
    } 
private class MyTransformationMethod extends ReplacementTransformationMethod{
        @Override
        protected char[] getOriginal() {
            char[] original={'\r','2'};
            return original;
        }
        @Override
        protected char[] getReplacement() {      
            char[] replacement={' ','3'};
            return replacement;
        }
      
    }

然后只要在开始的地方调用一次textView.setTransformationMethod(new MyTransformationMethod())就可以了。

显然,后面一种方法更好一些。

同样的可以重写PasswordTransformationMethod,它的公有函数有public CharSequence getTransformation (CharSequence source, View view)等。


某些场合,可能需要在运行时令某个 TextView (可能是运行时创建的,也可以是写在 XML 文件中的)。由于无法通过 XML 文件指定其为 password 输入属性,那么如何实现这个效果呢?

TextView 有两个方法:

       setInputType(int)
setTransformationMethod(TransformationMethod)

其 中 setInputType 可以更改 TextView 的输入方式:Contact、Email、Date、Time、Short Message、Normal Text、Password 等。还可以指定各种更正选项,如 单词首字母大写、句子首字母大写、自动更正等。

使用方法:

1int inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
2               | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
3               | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE;
4textView.setInputType(inputType);

而 setTransformationMethod 则可以支持将输入的字符转换,包括清除换行符、转换为掩码。使用方法:

1textView.setTransformationMethod(PasswordTransformationMethod.getInstance());

综合来说,如果需要实现自己的转换,可以通过实现 TransformationMethod 接口来达到你的目的(比如让输入的所有字符都变成 a,或者输入 a 显示 z,输入 z 显示 a 等)。

如需要动态显示隐藏,则可以使用:

 

1setTransformationMethod(HideReturnsTransformationMethod.getInstance());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值