Вопрос по android – Как избежать нескольких триггеров на EditText, когда пользователь печатает?

21

Я использую следующий код для выполнения поиска, когда пользователь вводит текст EditText:

<code>EditText queryView = (EditText) findViewById(R.id.querybox);
queryView.addTextChangedListener(new TextWatcher() {
  @Override
  public void afterTextChanged(Editable s) {
    triggerSearch(s.toString()); 
  }
  @Override
  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  }
  @Override
  public void onTextChanged(CharSequence s, int start, int before, int count) {
  }
});
</code>

Однако это срабатывает несколько раз, когда пользователь печатает слово. То есть, если пользователь вводит «hello», этот код будет запускаться 5 раз со значениями («h», «he», «hel», «hell», «hello»). Обычно это было бы хорошо, но инициируемый поиск дорог, и я не хочу тратить ресурсы на промежуточные поиски, которые бесполезны. То, что я хочу, это либо слушатель, который запускает только определенный порог после того, как пользователь начинает печатать, либо какую-то платформу, которая ждет в слушателе перед вызовомtriggerSearchи если другое событие инициируется до этого ожидания, оно отменяется.

Ваш Ответ

4   ответа
0

вам нужно знать, когда пользователь завершит работу. Я бы избегал сложных идей, чтобы попытаться выяснить, когда пользователь закончил печатать. Это приведет к тому, что пользователь будет сбит с толку относительно того, когда происходит поиск.

Простой ответ - «готово». Нажмите кнопку и примените onClickListener к кнопке и выполните поиск там.

Самый простой код: в XML

<Button
android:onClick="onDoneClicked"
... the rest of your button layout
/>

в яве:

@Override
public void onDoneClicked(View view){
EditText queryView = (EditText) findViewById(R.id.querybox);
triggerSearch(queryView.toString());
}
48

попытался запустить отложенный поиск. Код на самом деле довольно простой и надежный.

private final int TRIGGER_SERACH = 1;
// Where did 1000 come from? It's arbitrary, since I can't find average android typing speed.
private final long SEARCH_TRIGGER_DELAY_IN_MS = 1000;

  private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      if (msg.what == TRIGGER_SERACH) {
        triggerSearch();
      }
    }
  };

 queryView.addTextChangedListener(new TextWatcher() {

   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

   }

   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

   }

   @Override
   public void afterTextChanged(Editable s) {
    handler.removeMessages(TRIGGER_SERACH);
    handler.sendEmptyMessageDelayed(TRIGGER_SERACH, SEARCH_TRIGGER_DELAY_IN_MS);
   });
Почему утечка памяти:androiddesignpatterns.com/2013/01/…
@ Чолецки, пожалуйста, расскажи, как могут протекать утечки, и что статическое электричество предотвратит это?
@ jitenagarwal19 статический обработчик не будет хранить ссылку на включающий класс
Этот класс обработчика должен быть статическим, иначе могут возникнуть утечки.
3

triggerSearch; проверить длинуEditable s.

if(s.length() > THRESHOLD)

+1, так как до сих пор это самый умный подход для некоторых ситуаций
как вы определяете соответствующий порог? Также это не сработает, если пользователь печатает длинное слово, которое на много букв длиннее порогового значения.
Как вы заметили, пользователь не указал, какой поиск он запускает. Без контекста я не смогу предположить, что что-то слишком ограничено или излишне. Рассматривали ли вы, когда кто-то печатает менее 10 букв в секунду, где «h», «он»? , "hel", "hell", "hello" называется, потому что ваш порог слишком короткий? Оба ответа действительны, пожалуйста, пометьте мой ответ, если вы все еще обижаетесь и считаете, что это требует рассмотрения сообщества.
4

но через некоторое время, скажем, 100 мс, прошло с тех пор, какonTextChanged метод вызывается. Дополнительно сбрасывайте этот интервал каждый раз, когда вводится текст.

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

Похожие вопросы