android edittext 排版,EditText和TextView出现中文、英文等string串的排版问题

  • Post author:
  • Post category:其他


默认EditText和TextView自动换行。如果在string中出现了中文字符,排版出现意外,如图所示:

152607724.png

这是因为软盘默认的是半角输入,而字母与数字的占位与汉字不同,所以在默认的情况下会出现如上的排版情况。

但是如果将默认的半角变成全角之后就可以基本解决排版问题:

153044528.png

虽然全角看上去不好看,但是基本不会出现参差不齐。暂时没有找到其他的解决方法,如果不喜欢全角的效果,看来只能用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‘