如何检测用户是否只是按下SearchView.setOnQueryTextListener中的退格(删除)键?

时间:2016-04-03 04:29:54

标签: java android searchview

我有一个自定义自动完成功能,可以根据输入在onQueryTextChange方法中从远程服务器获取结果。它类似于JQuery自动完成插件,它通过Ajax在keyup监听器上获取结果。

然而,当用户只是按backspace删除之前输入的输入文本时,获取结果是非常浪费的,因为返回的结果在我的情况下通常是相同的。我怎样才能防止这种情况发生?

我尝试使用全局布尔变量backKeyPressed来检测用户是否按backspace并在onQueryTextChange中查看,但setOnKeyListener甚至无法正常工作一点都不没有记录" onKey"甚至已经在logcat中显示过。

是否有人对如何检测onQueryTextChange中是否按下了退格键有任何想法?

private boolean backKeyPressed = false;
private Runnable autoCompleteRunnable;
private Handler = new Handler(Looper.getMainLooper());
private String enteredSuggestion = "";

public boolean onCreateOptionsMenu(Menu menu) {

    /****************/

    searchView.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {

                    if (keyCode == KeyEvent.KEYCODE_DEL) {
                        backKeyPressed = true;
                    }else{
                        backKeyPressed = false;
                    }
                    Log.d("onKey",Boolean.toString(backKeyPressed));
                    return false;
                }
            });

            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    /**Some functions**/
                    return false;
                }

                @Override
                public boolean onQueryTextChange(final String inputText) {
                    handler.removeCallbacks(autoCompleteRunnable);

                    if(enteredSuggestion.trim().equals(inputText.trim())){
                       Log.d("response_on_duplicated","true");
                       return false;
                    }

                    if(backKeyPressed == true){
                        Log.d("response_onKey","No");
                        return false;
                    }
                    autoCompleteRunnable = new Runnable() {
                        public void run() {
                            fetchSuggestionFromRemoteServer(inputText);
                        }
                    };
                    handler.postDelayed(autoCompleteRunnable, 3000);

                    enteredSuggestion = inputText;

                    return false;
                }
            });
}

1 个答案:

答案 0 :(得分:3)

如果您无法获得退格键。你可以使用一个简单的解决方法。

您可以在进行服务器调用时存储查询字符串的length。 然后下次在onQueryTextChange中,您可以检查inputText的长度是否小于服务器调用字符串的长度。如果它小于那么用这个新长度更新服务器调用长度,因为如果下次没有用户删除2个字符并添加1个新字符,则代码将不会进行服务器调用。如果你想要一个伪代码,请告诉我。