【问题标题】:Implementing Text Watcher for EditText为 EditText 实现文本观察器
【发布时间】:2012-01-31 17:50:10
【问题描述】:

我有一个 EditText。当我单击它时,它变得可聚焦。我将键入要输入到 EditText 中的输入文本。我想为 EditText 实现一个监听器,这样当我停止输入时,它应该自动将该文本保存到数据库中,而不是有一个按钮。如何让 EditText 的监听器来监听输入是否停止?

【问题讨论】:

    标签: android android-edittext textwatcher


    【解决方案1】:

    像这样试试。

    EditText et = (EditText)findViewById(R.id.editText);
    Log.e("TextWatcherTest", "Set text xyz");
    et.setText("xyz");
    
    et.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) { }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
        @Override
        public void afterTextChanged(Editable s) {
            Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString());
        }
    });
    

    【讨论】:

      【解决方案2】:

      设置edittext imeOption

      editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
      

      通过使用这样的东西,

      editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
          @Override
          public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
              if (actionId == EditorInfo.IME_ACTION_DONE) {
                  // Specify your database function here.
                  return true;
              }
              return false;
          }
      });
      

      或者,您可以使用OnEditorActionListener 接口来避免匿名内部类。

      【讨论】:

      • 你也可以在点击完成后通过返回false而不是返回true来关闭虚拟键盘。
      【解决方案3】:

      将此添加到您的编辑文本中

      et1.addTextChangedListener(new TextWatcher() {
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
      
                  // TODO Auto-generated method stub
              }
      
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count, int after) {
      
                  // TODO Auto-generated method stub
              }
      
              @Override
              public void afterTextChanged(Editable s) {
      
                  // TODO Auto-generated method stub
              }
          });
      

      【讨论】:

        【解决方案4】:

        您也可以使用 Rx java 的 debounce 运算符。

        subject.debounce(300, TimeUnit.MILLISECONDS)
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .map(yourString -> {
                                   // save to db
                                }
                                return "";
                            })
                            .subscribe()
        

        在这里你可以定义时间限制,在你希望它保存在数据库中的时间之后。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多