【问题标题】:EditText - change text while typingEditText - 键入时更改文本
【发布时间】:2012-06-02 13:26:11
【问题描述】:

我需要在输入时替换 EditText 中的文本: 示例:如果用户按下“A”,它将被存储到缓冲区中,并在 EditText 上显示“D”(看起来他按下了“D”)。 现在我可以读取按下的字符,但我无法在 et 中显示任何字符以避免堆栈溢出:

final EditText et = (EditText) findViewById(R.id.editTexts);
    final TextView tv = (TextView) findViewById(R.id.textView2);

    et.addTextChangedListener(new TextWatcher()
    {
            public void afterTextChanged(Editable s){}
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            } 
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.length() > 0) {
                    tv.setText(s.toString().substring(s.length()-1));
                    et.setText("");
                }
            }
    });

【问题讨论】:

标签: java android


【解决方案1】:

您可以根据需要更改它::

public class SampleActivity extends Activity {
    TextWatcher tt = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final EditText et = (EditText) findViewById(R.id.editText1);
        final TextView tv = (TextView) findViewById(R.id.textView1);
        tt = new TextWatcher() {
           public void afterTextChanged(Editable s){
                et.setSelection(s.length());
           }
           public void beforeTextChanged(CharSequence s,int start,int count, int after){} 
           public void onTextChanged(CharSequence s, int start, int before, int count) {
               et.removeTextChangedListener(tt);
               et.setText(et.getText().toString().replace("A", "C"));
               et.addTextChangedListener(tt);
           }
       };
       et.addTextChangedListener(tt);
   }
}

【讨论】:

  • et 将“a”替换为“c”,但反过来它会在字段的开头添加字符
  • 也许它需要一个 ET.setSelection(s.length());某处!!
  • 我在调用 et.removeTextChangedListener(tt) 时遇到编译器错误。它抱怨tt 可能没有被初始化。您可以通过简单地将this 替换为tt 来避免这种情况。
  • 你不是给addTextChangedListener打了两次电话吗? onTextChanged 内的一个电话和onCreate 内的另一个电话
【解决方案2】:

为了以交互方式更改文本,您需要注册一个TextWatcher。但是尝试更改观察者内部的文本会导致对观察者的进一步调用。我的 hack 是在我想更改文本时暂时删除观察者,然后立即重新注册

    mEditText.addTextChangedListener(new TextWatcher() {
        @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
        @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
        @Override public void afterTextChanged(Editable editable) {
            mEditText.removeTextChangedListener(this);
            mEditText.setText(//TODO change whatever you like here);
            mEditText.setSelection(editable.length()); //moves the pointer to end
            mEditText.addTextChangedListener(this);
        }

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2019-03-10
    • 1970-01-01
    • 2016-08-18
    • 2011-11-11
    相关资源
    最近更新 更多