默认EditText和TextView自动换行。如果在string中出现了中文字符,排版出现意外,如图所示:
这是因为软盘默认的是半角输入,而字母与数字的占位与汉字不同,所以在默认的情况下会出现如上的排版情况。
但是如果将默认的半角变成全角之后就可以基本解决排版问题:
虽然全角看上去不好看,但是基本不会出现参差不齐。暂时没有找到其他的解决方法,如果不喜欢全角的效果,看来只能用canvas画上去了。。。
代码:
mTextWrite = (EditText) findViewById(R.id.note_editor_write);// 得到写文本框
//将输入的字母全部变成全角
mTextWrite.setOnKeyListener(new EditText.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
String temp = mTextWrite.getText().toString();
mTextWrite.setText("");
mTextWrite.append(ToSBC(temp));
return false;
}
});
// 半角转化为全角的方法
public String ToSBC(String input) {
// 半角转全角:
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == 32) {
c[i] = (char) 12288;
continue;
}
if (c[i] < 127 && c[i]>32)
c[i] = (char) (c[i] + 65248);
}
return new String(c);
}
// 全角转化为半角的方法
public String ToDBC(String input) {
char[] c = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (isChinese(c[i])) {
if (c[i] == 12288) {
c[i] = (char) 32;
continue;
}
if (c[i] > 65280 && c[i] < 65375)
c[i] = (char) (c[i] - 65248);
}
}
return new String(c);
}
ps:利用编码的方式判断字符是否为汉字的方法:
private boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
pps:出现排版错误的另一个情况:
android textview自动换行时为了保持单词的完整性,单词不会因为换行而断开。
解决方法:计算字符串长度,然后手动设定每一行显示多少个字母并加上‘\n‘
本文出自 “Alex_Michel” 博客,请务必保留此出处http://2960629.blog.51cto.com/2950629/636828