2016-02-05 129 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秒,直到上一次文本更改發生,以斷定用戶已停止鍵入。你可以根據你的需要修改它。

相關問題