13

図書館のウェブサイトにアクセスするための検索機能を作成しています。クエリ文字列が送信されると、プログラムは新しいスレッドを起動してウェブ上の情報を解析します。AVD では正常に動作しますが、私の HTC DesireHD は検索結果を繰り返し表示しました (実際の結果が 1. 2. 3. の場合、1. 2. 3. 1. 2. 3. のように見えます)。onQueryTextSubmit メソッドにブレークポイントを設定したところ、メソッド onQueryTextSubmit() のコードが 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);
        }
    }
}
4

5 に答える 5

31

SearchViewへのフォーカスをクリアすることが役に立ちました。

sv.clearFocus();

注:これにより、キーボードも非表示になります。

于 2013-10-29T10:09:14.383 に答える
4

ボタンを 1 回クリックすると onQueryTextSubmit が 2 回起動する理由を調べることは、OS によって制御されているためバグがある可能性があるため、それ自体では解決できない可能性がある問題です。本当の問題は、ボタンが 2 回以上続けてクリックされた場合に適切に処理することです。おそらく同じ効果があります。list.clear() を、リストを作成する場所と同じ場所に移動することをお勧めします。

于 2013-07-26T07:25:39.187 に答える
2

As the problem is that user presses search key on keyboard produces two key-event ACTION_DOWN and ACTION_UP,and some device would react to both these two messages.

I solved in a simple way, as I do not like the setIconified(), because, then searched text is erased, I just let one search per second, so have done this:

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;
    }
}
于 2014-10-17T17:04:53.623 に答える
1

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

于 2014-12-07T16:18:23.693 に答える
1

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

ユーザーがキーボードの検索キーを押すアクションは、2 つのキーイベント ACTION_DOWN と ACTION_UP を生成し、一部のデバイスはこれら 2 つのメッセージの両方に反応します (ACTION_UP のみに反応するはずです)。SDK またはデバイス自体のバグであることが判明しました。私たち開発者が制御することはできません。

これを解決するために、「sv.setIconified()」を追加してクエリテキストを空にし、ACTION_UP を無効にします。

于 2013-07-27T09:25:09.270 に答える