textwatcher两次拍摄的最后一个角色

时间:2014-05-05 05:02:02

标签: android android-edittext textwatcher

我正在尝试实现一个简单的Rich Text编辑器。该代码适用于字母和数字,但在我按空格/输入/删除之前输入的最后一个字符会在空格或输入后重复(附加)。

示例:如果我输入( hello world。),它会显示( helloo world。)。

有没有办法可以防止这个问题发生?

我的活动代码是:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tv = (TextView) findViewById(R.id.tv);
    textMessage = (EditText) findViewById(R.id.editText1);

    textMessage.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable s) {
            char c = s.charAt(s.length() - 1);

            Log.d("Value of c::", "" + c);
            if (c == '\n') {
                content.append("<br>");
                tv.setText(Html.fromHtml(content.toString()));
            } else {
                content.append(c);
                tv.setText(Html.fromHtml(content.toString()));
            }
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

        }
    });

我也尝试过onKey()但它对软键盘不起作用。

public boolean onKeyDown(int keyCode, KeyEvent event) {

System.out.println("pressed" + keyCode);

if (keyCode == KeyEvent.KEYCODE_DEL){ 
      content.deleteCharAt(content.length()); } 
else if (keyCode == KeyEvent.KEYCODE_ENTER){ 
      content.append("</br>");
      System.out.println("enter pressed"); }
else { char c = (char) keyCode;
      Log.d("Keycode cast to char:::::", "" + c);
      content.append(); } 
return super.onKeyDown(keyCode, event);
   }


@Override 
public boolean onKey(DialogInterface dialog, int keyCode,
 KeyEvent event) { 
// TODO Auto-generated method stub

System.out.println("pressed" + keyCode); 
if (keyCode == KeyEvent.KEYCODE_DEL){ 
      content.deleteCharAt(content.length()); }
else if (keyCode == KeyEvent.KEYCODE_ENTER){
      content.append("</br>");
      System.out.println("enter pressed"); } 
else 
     { char c = (char) keyCode;
     Log.d("Keycode cast to char:::::", "" + c);
     content.append(); } 
     return false; }

2 个答案:

答案 0 :(得分:1)

假设您有一个像Shoe这样的字符串,所以声明

s.length() - 1 

将返回3,请记住java中的数组索引将从0开始,所以

s.charAt(s.length() - 1)

将返回字符&#34; e&#34;再次。然后在你的if else子句中追加&#34; e&#34;到你的String,结果将是&#34; Shoee&#34;

编辑:根据你的评论,假设一个空字符串,所以你输入第一个字母&#34; s&#34;所以s会按预期附加到你的内容,你输入第二个字&#34; h&#34;以便附加到您的内容的角色将是&#34; h&#34;所以写信&#34; e&#34;,但是如果你在&#34;鞋&#34;之后放置空间你有&#34;鞋&#34;在你的内容中,你的if语句永远不会被运行,你的最后一句话会被重复,因为你用 == 检查你的字符串,这对于String或charSequence是不正确的。 你应该使用equal()代替

如果((&#34; \ n&#34;)等于(c))的

答案 1 :(得分:0)

最终使用不同的方法解决了它。 我没有附加每个字符,而是使用跨度字体进行更改,以使用 Html.toHtml()进行保存。 而不是生成Html文档以手动保存它,我使用预定义的 HTML 类自动生成它。