如何检测用户是否只是按 SearchView.setOnQueryTextListener 中的退格(删除)键?
How to detect whether user is just pressing backspace (delete) key in SearchView.setOnQueryTextListener?
我有一个自定义自动完成功能,可以根据输入以 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;
}
});
}
如果您无法获取退格键。您可以使用一个简单的解决方法。
您可以在进行服务器调用时存储查询字符串的 length
。
然后下次在 onQueryTextChange
中检查 inputText
的长度是否小于服务器调用字符串的长度。如果小于,则使用此新长度更新服务器调用长度,因为如果下次用户删除 2 个字符并添加 1 个新字符时您不这样做,您的代码将不会进行服务器调用。如果你想要伪代码,请告诉我。
我有一个自定义自动完成功能,可以根据输入以 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;
}
});
}
如果您无法获取退格键。您可以使用一个简单的解决方法。
您可以在进行服务器调用时存储查询字符串的 length
。
然后下次在 onQueryTextChange
中检查 inputText
的长度是否小于服务器调用字符串的长度。如果小于,则使用此新长度更新服务器调用长度,因为如果下次用户删除 2 个字符并添加 1 个新字符时您不这样做,您的代码将不会进行服务器调用。如果你想要伪代码,请告诉我。