默认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‘