当前位置: 首页 > 知识库问答 >
问题:

在android中替换TextWatcher中的字符

张坚白
2023-03-14

我使用TextWatcher来更改按下的键值。我的目标是在打字时替换一些字符。例如当我键入键时,如果到达“S”字符,就用“a”字符替换它。我的问题是:我应该在beforeTextChanged中做吗??怎么会?有人能给我举个例子吗?

共有3个答案

贲宏硕
2023-03-14

您必须在后文本更改中执行此操作,但不要忘记分离并重新连接文本更改的接收器以防止无限循环
下面显示了一个简单的示例:

public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        //.. do changes here ..//
        editText.setText(newText);
        editText.addTextChangedListener(this);
}

但是当您调用 setText 时,还有另一个问题,它会导致光标移动到 textView 中文本的末尾。因此,您必须自己计算光标的新位置,请记住,用户可以通过粘贴或删除文本的选定部分一次输入多个字符。
下面是一个更完整的示例。此观察程序类删除文本的所有非数字字符。

public class NumWatcher implements TextWatcher {
    private EditText editText;
    private int selPos;
    private String oldString, newString;
    public NumWatcher(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        selPos = editText.getSelectionStart();
        oldString = myFilter(s.toString());
    }

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

    @Override
    public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
        newString = myFilter(s.toString());
        editText.setText(newString);
        int newPos = selPos + (newString.length() - oldString.length());
        if (newPos < 0) newPos = 0;
        editText.setSelection(newPos);
        editText.addTextChangedListener(this);
    }

    public String myFilter(String s) {
        String digits;
        digits = s.replaceAll("[^0-9]", "");
        if (s.equals("")) return "";
        return digits;
    }
}
穆歌者
2023-03-14

使用beforeTextChanged没有用,因为它不会中断EditText的键的实际打印。我会使用类似于:

    public void afterTextChanged(Editable s) {
        if(s.length() > 0 && s.toString().charAt(s.length()-1) == 'S')
        {
            final String newText = s.toString().substring(0, s.length()-1) + "a"; 
            editText.setText(newText); 
        }
    }

我添加了一些toString(),不是100%确定Editable是如何工作的,但我认为这应该涵盖了它。

陆文斌
2023-03-14

我知道这篇文章已经有几年的历史了,但是这两个版本都不适合我,并且在两个答案之间建立了混合体。

@Override
public void afterTextChanged(Editable editable) {    
    if (editable.toString().contains(",")) {
       Editable ab = new SpannableStringBuilder(editable.toString().replace(",", ""));
       editable.replace(0, editable.length(), ab);
    }
}
 类似资料:
  • 我有一个,当你点击next时,你可以在其中写一些东西。你写的文本会被写入另一个editText..它工作得很好。。但我想用textWatcher替换一些字母。。 示例:如何使S为$或O为@ 更新: 我的代码会将你在EditText中写的内容输入到下面的大文本视图中…当我按下按钮时,它会设置你写的文本,但我想将一些字母(例如S)替换为$…当我键入S时,什么都不会发生…只是S不会变成$… 我做错了什么

  • 每当“q”被写为我附加TextWatcher的edittext的最后一个字符时,这个“q”就会被替换为“a”。我使用: 但是,当我测试代码时,当我输入“q”时,什么也没发生。一些帮助?非常感谢。

  • 在Android应用程序中,我有一个< code>EditText,它应该用应用程序数据中的值替换某些字符串。 例如,如果用户键入则应将其替换为当前登录的用户的名称。 在 的 方法中的可编辑参数将替换为正确的值,但问题是,如果我按下任何字符,被替换为实际用户名之后,它会附加后跟按下的字符。 e. g. 假设当前登录的用户名是 a、 如果输入 b.< code>afterTextChanged()将

  • 我正在使用一个具有许多不同库依赖关系的gradle项目,并使用新的清单合并。在我的

  • 我有一个PHP脚本这是一个字符串替换函数,它接受数组中的字符,如果在字符串中找到任何字符,就替换它们。是否有与该函数等价的java函数。我找到了一些方法,但有些是使用循环,有些是重复语句,但在Java中没有找到类似的单行解决方案。

  • 问题是:如何替换BuildVariant的字符串资源? 我尝试了以下方法(在本文中描述): 但是使用这个,我得到了这个错误: