Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测用户是否只是在SearchView.setOnQueryTextListener中按backspace(delete)键?_Java_Android_Searchview - Fatal编程技术网

Java 如何检测用户是否只是在SearchView.setOnQueryTextListener中按backspace(delete)键?

Java 如何检测用户是否只是在SearchView.setOnQueryTextListener中按backspace(delete)键?,java,android,searchview,Java,Android,Searchview,我有一个自定义的自动完成函数,它根据输入在onQueryTextChange方法中从远程服务器获取结果。它类似于jqueryautocomplete插件,该插件在keyup监听器上通过Ajax获取结果 然而,当用户只是按backspace删除他以前输入的输入文本时,获取结果是相当浪费的,因为在我的情况下,返回的结果通常是相同的。我怎样才能防止这种情况发生 我曾尝试使用一个全局布尔变量backKeyPressed来检测用户是否正在按backspace,并在onQueryTextChange中检查它

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

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

我曾尝试使用一个全局布尔变量
backKeyPressed
来检测用户是否正在按
backspace
,并在
onQueryTextChange
中检查它,但
setonkeylister
甚至根本不起作用。logcat中甚至没有显示“onKey”的日志

有人知道如何在
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;
                }
            });
}

如果你不能得到退格键。你可以用一个简单的解决方法

在进行服务器调用时,可以存储查询字符串的
长度。

然后下次在
onQueryTextChange
中,您可以检查
inputText
的长度是否小于服务器调用字符串的长度。如果小于此值,则使用此新长度更新服务器调用长度,因为如果下次用户删除2个字符并添加1个新字符,则您的代码将不会进行服务器调用。如果你想要一个伪代码,一定要让我知道。

如果用户按backspace键,通常你会得到更多的结果,不是吗?那是什么原因呢?你用的是软键盘吗?因为OnKeyListener无法处理它@1binary0,啊,是的,我在用软糖keyboards@pskink,谢谢,我会考虑的。ACTV是否需要事先建立一份建议清单?我在远程数据库中有大约一千个条目。我当前的方法基于用户的输入一次只获取五个条目。请看,我根据您的建议快速添加了一些代码。请参阅用于存储以前输入值的变量
enteredSuggestion
。如果与当前输入值相同,则不会进行服务器调用。接下来,我将比较它们的长度。只是一个粗略的想法。请随便给我一些建议。是的,那太好了!只有一件事,在您的
onQueryTextChange
中,您使用了此作业<代码>输入的建议=项目标题。不应该是
enteredSuggestion=inputText