【问题标题】:Last character taken twice by textwatchertextwatcher 两次获取最后一个字符
【发布时间】:2014-05-05 05:02:01
【问题描述】:

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

示例:如果我输入 (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; }

【问题讨论】:

  • 本网站不是针对初学者问题的帮助台。我们不是来修复您的代码的。它更像是一个编程的维基百科,一个很好的问题和答案的巨大集合。它主要对谷歌搜索者有用。它也不是论坛。
  • 但常见问题解答并没有说这是一个适合初学者的地方。它说这是一个“专业和狂热的程序员”的地方。是的,你来错地方了,如果你想让人们修复你的代码,最好去rentacoder.com。或者去专家交流会,也许?
  • @sashoalm Stack Overflow 也适用于想要学习并为此付出努力的初学者
  • 仅仅提供保证并不像说“我尝试过 X,但 Y 发生了。我观察到了我不理解的 Z”等有用。如果你'd 以更传统的方式格式化您的代码。您的 IDE 应该能够自动为您执行此操作。

标签: android android-edittext textwatcher


【解决方案1】:

假设你有一个像 Shoe 这样的字符串,所以语句

s.length() - 1 

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

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

将再次返回字符“e”。然后在您的 if else 子句中,您将“e”附加到您的字符串,结果将是“Shoee”

编辑:根据您的评论,假设一个空字符串,因此您输入第一个字母“s”,这样 s 将按预期附加到您的内容中,您输入第二个单词“h”所以附加到您的内容的字符将是“h”等字母“e”,但是如果您在“shoe”之后放置空格,则您的内容中有“shoe”,并且您的 if 语句将永远不会运行,您的最后一个字会重复,因为您使用 == 检查您的字符,这对于 String 或 charSequence 是不正确的。 你应该使用 equal() 代替

if(("\n").equals(c))

【讨论】:

  • 字符串最初为空,值仅附加在 content.append(c) 中;如果长度是一个问题,那么我插入的任何东西都应该重复这个问题。但它只发生在空格/删除/输入按钮上。。
  • code if(("\n").equals(c)) enter 不满足这个条件。它只是重新附加最后一个字符和一个空格。
  • @sisir 你找到解决方案了吗,因为我面临同样的问题
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2020-09-17
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多