2016-02-05 14 views
8

Tôi có trường EditText trong bố cục của mình hay không. Tôi muốn thực hiện hành động khi người dùng ngừng nhập bằng văn bản đó. Tôi đã thực hiện TextWatcher và sử dụng nó là chức năngCách phát hiện xem người dùng có dừng nhập vào 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) { 

    } 

chức năng OnTextChanged và afterTextChanged được gọi là chỉ sau khi nhập bất kỳ ký tự, nhưng tôi muốn thực hiện hành động sau khi người dùng ngừng gõ vào đó lĩnh vực EditText, giống như facebook không vào đó là " Đăng ký "trang.

Làm cách nào tôi có thể thực hiện việc này, vui lòng cho tôi biết nếu có ai có ý tưởng ở đây.

Cảm ơn một tấn nâng cao.

Trả lời

12

Đây là cách tôi đã làm và làm việc cho tôi!

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

Đó là một loại phương pháp tiếp cận khác. Nhưng bạn có thể làm một cái gì đó như thế này

Tôi giả định rằng sau khi người dùng bắt đầu nhập văn bản, và anh ấy đã không nhập trong một khoảng thời gian cụ thể hơn có thể được coi là anh ấy đã ngừng nhập.

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 
      ); 
     } 
    }); 

Về cơ bản những gì bạn đang làm gì ở đây là, bất cứ khi nào người dùng bắt đầu gõ, nếu có một khoảng cách thời điểm 5000 mili giây trong việc thay đổi văn bản bên trong EditText, bạn xem xét như là người dùng đã ngừng gõ. Tất nhiên bạn có thể thay đổi thời gian thành bất kỳ điều gì bạn muốn

+0

Cá nhân tôi không thích cách tiếp cận này, nếu người dùng đang nói chuyện với bạn bè khi nhập văn bản và ngừng nhập thì sao? bạn có thể sửa lỗi này bằng cách tăng thời gian nhưng sau đó hiệu ứng mong muốn sẽ bị mất. – Hughzi

+0

nhưng không có cách nào tốt hơn để kết luận liệu anh ấy có đang gõ hay không. –

+0

có, nếu họ đã lấy nét từ văn bản chỉnh sửa thì họ không thể gõ, – Hughzi

4

Bạn có thể sử dụng trình nghe thay đổi tập trung. Nếu EditText có tập trung sau đó giả định người dùng vẫn chỉnh sửa nếu không họ đã dừng lại và bạn có thể thực hiện hành động của bạn:

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

thể rống lên đang giúp bạn

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

tôi đã sử dụng một CountDownTimer để tìm hiểu xem người dùng ngừng gõ sau một thời gian. Tôi hy vọng sẽ giúp.

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

Có một cách rất đơn giản và dễ dàng để làm điều này bằng RxBindings cho Android,

Nhận thư viện nếu bạn chưa sẵn sàng,

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

Thêm và chỉnh sửa đoạn mã này để nhu cầu của bạn,

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

Nhà cung cấp dịch vụ gỡ nợ là gì? - Learn more about it here

Trong bối cảnh của chúng tôi, debounce sẽ chỉ thông báo cho bạn về những sự thay đổi văn bản bên trong EditText sau một thời gian nhất định đã trôi qua từ sự thay đổi văn bản cuối cùng đã xảy ra bên trong EditText.

Ở đây tôi đang đợi 3 giây cho đến khi thay đổi văn bản cuối cùng xảy ra để kết luận rằng người dùng đã ngừng nhập. Bạn có thể sửa đổi nó theo nhu cầu của bạn.

Các vấn đề liên quan