我正在编写一个搜索函数来访问图书馆网站。提交查询字符串时,程序会启动一个新线程来解析网络上的信息。 它在 AVD 上运行正常,但我的 HTC DesireHD 重复显示搜索结果(如果实际结果是 1. 2. 3。则显示为 1. 2. 3. 1. 2. 3。)。 我在onQueryTextSubmit方法处设置断点,发现onQueryTextSubmit()方法中的代码被执行了两次。 这是我的代码:
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);
}
}
}
清除对 SearchView 的关注对我很有帮助。
sv.clearFocus();
注意:这也会隐藏键盘。
找出为什么单击按钮一次会导致 onQueryTextSubmit 触发两次本身就是一个问题,您可能无法解决,因为它是由可能有错误的操作系统控制的。真正的问题是如何正确处理快速连续单击按钮两次或多次的情况,这可能会产生相同的效果。我建议将 list.clear() 移动到填充列表的同一位置。
问题是用户按下键盘上的搜索键会产生两个按键事件 ACTION_DOWN 和 ACTION_UP,并且某些设备会对这两个消息做出反应。
我用一种简单的方式解决了,因为我不喜欢 setIconified(),因为,然后搜索的文本被删除,我只每秒搜索一次,所以这样做了:
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;
}
}
我一直在寻找这件事的原因和解决办法,并找到了一些东西。 发生这种情况的原因: https://code.google.com/p/android/issues/detail?id=24599
用户在键盘上按下搜索键的动作会产生两个按键事件 ACTION_DOWN 和 ACTION_UP,并且某些设备会对这两个消息做出反应(应该只对 ACTION_UP 做出反应),事实证明这是 SDK 或设备本身的错误这是我们开发者无法控制的。
为了解决这个问题,我添加“sv.setIconified()”来清空查询文本,以使 ACTION_UP 无效。
我遇到这个问题是因为我使用了 _searchView.setInputType(InputType.TYPE_NULL);,所以通过删除这一行 onQueryTextSubmit 函数调用一次
我通过放置一个标志来了解该操作何时发生来解决我的问题。
var isEntered = false
override fun onQueryTextSubmit(query: String): Boolean {
if (!isEntered) {
// perform the action you want to undertake here
isEntered = true
}
return true
}
override fun onResume() {
super.onResume()
isEntered = false
}