2016-02-05 150 views
8

我的布局中有一个EditText字段。我想在用户停止输入该编辑文本时执行操作。我已经实现TextWatcher和使用它的功能如何检测用户是否停止在EditText中输入android

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


@Override 
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { } 

@Override 
    public void afterTextChanged(Editable editable) { 

    } 

功能onTextChanged和afterTextChanged得到的只是输入任何字符后调用,但我想执行操作的用户停止在的EditText字段中输入后,就像Facebook并在它的“登记“页面。

我该如何实现这一点,请告诉我,如果有人在这里有任何想法。

先进的感谢一吨。

回答

12

这就是我为我做的和为我工作的!

long delay = 1000; // 1 seconds after user stops typing 
long last_text_edit = 0; 
Handler handler = new Handler(); 

private Runnable input_finish_checker = new Runnable() { 
    public void run() { 
     if (System.currentTimeMillis() > (last_text_edit + delay - 500)) { 
      // TODO: do what you need here 
      // ............ 
      // ............ 
      DoStaff(); 
     } 
    } 
}; 

EditText editText = (EditText) findViewById(R.id.editTextStopId); 
editText.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged (CharSequence s,int start, int count, 
    int after){ 
    } 
    @Override 
    public void onTextChanged (final CharSequence s, int start, int before, 
    int count){ 
     //You need to remove this to run only once 
     handler.removeCallbacks(input_finish_checker); 

    } 
    @Override 
    public void afterTextChanged (final Editable s){ 
     //avoid triggering event when text is empty 
     if (s.length() > 0) { 
      last_text_edit = System.currentTimeMillis(); 
      handler.postDelayed(input_finish_checker, delay); 
     } else { 

     } 
    } 
} 

); 
2

这是一种有点不同的方法。但你可以做这样的事情

我假设在用户开始在edittext中输入内容后,他没有输入特定的时间段,而是可以认为他停止了输入。

editText.addTextChangedListener(new TextWatcher() { 

     boolean isTyping = false; 

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

     private Timer timer = new Timer(); 
     private final long DELAY = 5000; // milliseconds 

     @Override 
     public void afterTextChanged(final Editable s) { 
      Log.d("", ""); 
      if(!isTyping) { 
       Log.d(TAG, "started typing"); 
       // Send notification for start typing event 
       isTyping = true; 
      } 
      timer.cancel(); 
      timer = new Timer(); 
      timer.schedule(
        new TimerTask() { 
         @Override 
         public void run() { 
          isTyping = false; 
          Log.d(TAG, "stopped typing"); 
          //send notification for stopped typing event 
         } 
        }, 
        DELAY 
      ); 
     } 
    }); 

基本上你在这里做的,只要用户开始输入,如果有5000毫秒改变的EditText中的文本的时间间隔,你认为是用户已经停止打字。当然,你可以改变任何你想要的时间

+0

我个人不喜欢这种方法,如果用户在输入文本时与朋友交谈并停止输入,该怎么办?你可以通过增加时间来解决这个问题,但是所需的效果将会丢失。 – Hughzi

+0

但比没有更好的方式来断定他是否打字。 –

+0

如果他们已将焦点从编辑文本中除去,那么他们不可能键入, – Hughzi

4

你可以使用焦点更改侦听器。如果EditText上具有焦点再假设用户仍在编辑,否则他们已经停止了,你可以执行你的行动:

EditText et = new EditText(mContext); 
    et.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean hasFocus) { 
      if (hasFocus) { 
       //user has focused 
      } else { 
       //focus has stopped perform your desired action 
      } 
     } 
    }); 
-4

也许会叫代码帮助您

yourEdiTtext.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       //Write your code for on change in edittext 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 
0

我用CountDownTimer如果用户找出停止打字后不久。我希望能提供帮助。

yourEditText.addTextChangedListener(new TextWatcher() { 

     CountDownTimer timer = null; 

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

     } 

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

      if (timer != null) { 
       timer.cancel(); 
      } 

      timer = new CountDownTimer(1500, 1000) { 

       public void onTick(long millisUntilFinished) { 
       } 

       public void onFinish() { 

        //do what you wish 

       } 

      }.start(); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
5

有一个非常简单和容易做这个使用RxBindings为Android的方式,

获取库,如果你还没有准备好,

compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' 

添加和修改这个代码段您的需求,

RxTextView.textChanges(mEditText) 
      .debounce(3, TimeUnit.SECONDS) 
      .subscribe(textChanged -> { 
       Log.d("TAG", "Stopped typing!"); 
      }); 

什么是防抖操作? - Learn more about it here

在我们的背景下,反跳,只会在一定时间已经从该EditText内发生的最终文本的变化通过后通知您EditText中的文本改变。

在这里,我正在等待3秒,直到上一次文本更改发生,以断定用户已停止键入。你可以根据你的需要修改它。

相关问题