2013-07-26 13 views
11

ライブラリのWebサイトにアクセスするための検索機能を作成しています。クエリ文字列が送信されると、プログラムは新しいスレッドを起動してWeb上の情報を解析します。 これはAVDで正常に動作しますが、私のHTC DesireHDは検索結果を繰り返し表示します(実際の結果が1の場合は2. 3. 3. 1と表示されます)。 onQueryTextSubmitメソッドでブレークポイントを設定すると、メソッドonQueryTextSubmit()のコードが2回実行されていました。 とここに私のコードです:SearchView onQueryTextSubmitを1回押すと2回実行する

sv.setOnQueryTextListener(new OnQueryTextListener(){ 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      list.clear(); 
      String str = null; 
      try {//encoding Chinese character 
       str = new String(query 
         .trim().getBytes(), "ISO-8859-1"); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 
      SearchPost sp = new SearchPost(SEARCH_URL + str); 
      new Thread(sp).start(); 
      return false; 
     } 
    }); 

protected class SearchPost implements Runnable{ 
    public String url = ""; 
    SearchPost(String urls){ 
     url = urls; 
    } 
    public SearchPost() { 
    } 
    @Override 
    public void run() { 
     Message message = handler.obtainMessage(); 
     message.what = DOWNLOAD_COMPLETE; 
     try{ 
      doc = Jsoup.connect(url).get(); 
       handler.sendMessage(message); 
     }catch(IOException e){ 
      e.printStackTrace(); 
      message.what = DOWNLOAD_FAIL; 
      handler.sendMessage(message); 
     } 
    } 
} 
+0

なぜメソッドの戻り値をfalseに指定しましたか? –

答えて

3

ボタンをクリックすると、一度onQueryTextSubmitは二回発射する原因と理由を見つけることは、それがあるかもしれないOSによって制御されるよう、あなたが解決することができない場合がありますことを、自身の問題ですバギー。本当の問題は、おそらく同じ効果があるボタンを2回以上連続してすばやくクリックした場合を適切に処理することです。 list.clear()をリストに入れる場所と同じ場所に移動させることをお勧めします。

+0

あなたが示唆しているようにlist.clear()を動かしても、接続スレッドは2回実行されますが、潜在的なバグは残っています...ありがとうとにかく〜 – futureer

+0

プログラムが動作するプラットフォームでは、クイックシーケンスで2回? – Tarik

+0

私のHTCのように繰り返し表示されているのですが、なぜそれが起こったのかわかりました。「検索」を押すとACTION_DOWNとACTION_UPが生成されます。どちらも、いくつかのデバイスでメソッドをトリガーします。あなたが正しい。 – futureer

1

私はこの問題の原因と解決策を探し続け、何かを見つけます。 ことが起こる理由: https://code.google.com/p/android/issues/detail?id=24599

をユーザがキーボード上の検索キーを押すことアクションは二つの重要なイベントACTION_DOWNとACTION_UPを生成し、いくつかのデバイスは、(のみACTION_UPに反応することになって)これら2つのメッセージの両方に反応するであろう、私たちの開発者が制御することができないSDKまたはDevice自体のバグであることが判明しました。

これを解決するために、ACTION_UPを無効にするために、 "sv.setIconified()"を追加してquerytextを空にします。

+0

これは本当の問題です。私はむしろ、実行中のクエリや完了したクエリを再実行しないことで解決するでしょう(例えば、クエリ文字列を使ってクエリを識別する方法を必要とします。同じクエリを再実行する方法もありますが) 。いずれにしても厄介です。 – desseim

26

にフォーカスを移動します。SearchViewが私を助けました。

sv.clearFocus();

注:これもキーボードを非表示にします。

+0

が働いた。ありがとう:) –

1

問題は、ユーザーがキーボードの検索キーを押すと、2つのキーイベントACTION_DOWNとACTION_UPが生成され、一部のデバイスがこれらの2つのメッセージに反応するためです。

私はsetIconifiedを()好きではないとして、その後、テキストは、私はちょうど、毎秒1件の検索を聞かせて消去され、検索するので、この行っているので、私は、簡単な方法で解決

public boolean onQueryTextSubmit(String s) { 

    long actualSearchTime = (Calendar.getInstance()).getTimeInMillis(); 
    // Only one search every second to avoid key-down & key-up   
    if (actualSearchTime > lastSearchTime + 1000) 
    { 
     lastSearchTime=actualSearchTime; 
    } 
} 
1

Iを_searchView.setInputType(InputType.TYPE_NULL);を使用しているためこの問題が発生しました。この行を削除すると、一度呼び出されるonQueryTextSubmit関数が呼び出されます

関連する問題