0

Я разрабатываю приложение для чата. Я могу получить событие, чтобы обновить статус ввода при вводе пользователя или при полном удалении пользователя, я могу обновить его как «не печатать статус» и показываться как онлайн. Пока этот процесс не прекратится.Как обращаться, если пользователь остановился после ввода в edroidxt android?

Но проблема в том, что пользователь набрал несколько строк и остановился, я не должен отображать ввод, который применяется в whatsapp. Как справиться с этим?

Вот код, который я сделал.

 ChatMsg.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
        if (edtChatMsg.getText().toString().trim().length() > 0) { 
        if (!isTyping) { 
          isTyping = true; 
          serviceCall(); 
          } 
        else{ 
         isTyping = false; 
         serviceCall(); 
         } 
      } 
     so at result 
    @Override 
    protected void onTyping(String message) { 
    if (message.equalsIgnoreCase("Typing…")) { 
     txtUserPersonStatus.setText("Typing…"); 
    } else { 
     txtUserPersonStatus.setText("Online"); 
    } 
} 

Мой вопрос в том, как обращаться, когда пользователь вводит клавиатуру какое-то время, а затем останавливается.

Спасибо.

ответ

4

В основном вам нужно реализовать какой-то тайм-аут. Каждый раз, когда пользователь вводит что-то, вам нужно запланировать тайм-аут и сбросить все таймауты, которые вы запланировали раньше. Таким образом, когда пользователь перестает печатать, таймер запускается по истечении указанного времени.

Вы можете сделать это с помощью Handler, например:

final int TYPING_TIMEOUT = 5000; // 5 seconds timeout 
final Handler timeoutHandler = new Handler(); 
final Runnable typingTimeout = new Runnable() { 
    public void run() { 
     isTyping = false; 
     serviceCall(); 
    } 
}; 

ChatMsg.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     // reset the timeout 
     timeoutHandler.removeCallbacks(typingTimeout); 

     if (edtChatMsg.getText().toString().trim().length() > 0) { 
      // schedule the timeout 
      timeoutHandler.postDelayed(typingTimeout, TYPING_TIMEOUT); 

      if (!isTyping) { 
       isTyping = true; 
       serviceCall(); 
      } 
     } 
     else { 
      isTyping = false; 
      serviceCall(); 
     } 
    } 
}); 
+0

совершенным. спасибо :-) – Shadow

+0

идеальный на данный момент :) –

0

Используйте Handler:

_AFKHandler = new Handler(); 
_AFKRunnable = new Runnable() { 
      public void run() { 
       isTyping = false; 
         serviceCall(); 
      } 
     }; 

ChatMsg.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
        _AFKHandler.removeCallbacks(_AFKRunnable); 
        if (edtChatMsg.getText().toString().trim().length() > 0) { 
        if (!isTyping) { 
          isTyping = true; 
          serviceCall(); 
          _AFKHandler.postDelayed(_AFKRunnable,AFK_TIMEOUT_VALUE_IN_MS); 
          } 
        else{ 
         isTyping = false; 
         serviceCall(); 
         } 
      } 
     so at result 
    @Override 
    protected void onTyping(String message) { 
    if (message.equalsIgnoreCase("Typing…")) { 
     txtUserPersonStatus.setText("Typing…"); 
    } else { 
     txtUserPersonStatus.setText("Online"); 
    } 
} 
0

Я думаю, что вам нужно использовать:

@Override 
public void afterTextChanged(Editable arg0) { 
    // arg0=null ,Handler ---is empty ; 

} 

@Override 
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
     int arg3) { 
    // Handler --- is typing 


}