最近要写一个小程序,要在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 等。还可以指定各种更正选项,如 单词首字母大写、句子首字母大写、自动更正等。
使用方法:
1 | int 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; |
4 | textView.setInputType(inputType); |
而 setTransformationMethod 则可以支持将输入的字符转换,包括清除换行符、转换为掩码。使用方法:
1 | textView.setTransformationMethod(PasswordTransformationMethod.getInstance()); |
综合来说,如果需要实现自己的转换,可以通过实现 TransformationMethod 接口来达到你的目的(比如让输入的所有字符都变成 a,或者输入 a 显示 z,输入 z 显示 a 等)。
如需要动态显示隐藏,则可以使用:
1 | setTransformationMethod(HideReturnsTransformationMethod.getInstance()); |