24

ユーザーが EditText に入力したときに、次のコードを使用して検索を実行します。

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

ただし、これは、ユーザーが単語を入力しているときに複数回トリガーされます。つまり、ユーザーが「hello」と入力すると、このコードは値 (「h」、「he」、「hel」、「hell」、「hello」) で 5 回トリガーされます。通常はこれで問題ありませんが、トリガーされた検索はコストがかかるため、あまり役に立たない中間検索でリソースを浪費したくありません。triggerSearch私が欲しいのは、ユーザーが入力を開始した後に特定のしきい値のみをトリガーするリスナー、または を呼び出す前にリスナーで待機し、その待機前に別のイベントがトリガーされた場合、それ自体をキャンセルする何らかのフレームワークです。

4

4 に答える 4

51

適切なイベント インターフェイスが見つからなかったため、遅延検索をトリガーしてみました。コードは実際には非常にシンプルで堅牢です。

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);
   });
于 2012-04-19T09:00:58.960 に答える
4

onTextChanged1 つの解決策は、トリガーされた検索をすぐに実行するのではなく、メソッドが呼び出されてから一定の間隔 (たとえば 100 ミリ秒) が経過した後に実行することです。さらに、テキストが入力されるたびにこの間隔をリセットします。

このようにして、トリガーされた検索は、ユーザーが入力している間は呼び出されません。

于 2012-04-18T20:16:51.300 に答える
3

を呼び出す前にリスナーで待機しtriggerSearchます。の長さをテストしEditable sます。

if(s.length() > THRESHOLD)

于 2012-04-18T20:19:33.553 に答える
1

ボタンが押されるたびに検索をトリガーしたくない場合は、ユーザーがいつ完了したかを知る必要があります。ユーザーがいつ入力を終了したかを把握しようとする複雑なアイデアは避けたいと思います。これにより、検索がいつ行われるかについてユーザーが混乱する可能性があります。

簡単な答えは、「完了」ボタンを配置し、ボタンに onClickListener を適用して、そこで検索を実行することです。

最も簡単なコード: xml

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

Javaで:

@Override
public void onDoneClicked(View view){
EditText queryView = (EditText) findViewById(R.id.querybox);
triggerSearch(queryView.toString());
}
于 2012-04-18T21:50:50.210 に答える