SearchView 中的 onQueryTextSubmit 在 Android Java 中被处理了两次

The onQueryTextSubmit in SearchView is processed twice in Android Java

为什么SearchView中的onQueryTextSubmit方法被处理了两次? 我需要一个结果,我该怎么做?

这是我的代码:

 public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            if (query != null)
                audioRequest(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
    return true;
}

只是一个镜头。由于您是自己处理搜索,因此请尝试返回 true 而不是 false。

@Override
public boolean onQueryTextSubmit(String query) {
    if (query != null)
        audioRequest(query);
    return true;
}

http://developer.android.com/reference/android/widget/SearchView.OnQueryTextListener.html

尝试在文本更改为这样后调用您的方法

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

        @Override
        public boolean onQueryTextChange(String newText) {
            if (newText != null)
                audioRequest(newText);
            return false;
        }
    });

您可以使用以下代码来防止 onQueryTextSubmit 被执行两次:

searchView.clearFocus();

当从模拟器上的键盘输入时,它会生成两个输出,但当单击模拟器键盘上的搜索按钮时,它会创建单个输出。所以,我认为你不应该担心这个。在所有手机或平板电脑上,此错误可能不会发生。

但是,searchView.clearFocus();也在这里工作。

对于遇到同样问题的每个人,这里是文档中关于 onQueryTextSubmit(String query) 方法的内容 here :

The listener can override the standard behavior by returning true to indicate that it has handled the submit request.

所以只需将 return false 替换为 return true :

@Override
public boolean onQueryTextSubmit(String query) {
    if (query != null)
        audioRequest(query);
    return true;
}

想要搜索 1 个以上的词?

searchView.setOnQueryTextListener(新SearchView.OnQueryTextListener() { @覆盖 public boolean onQueryTextSubmit(字符串查询) {return 错误; }

        @Override
        public boolean onQueryTextChange(String newText) {


            newText = newText.toLowerCase();

            final ArrayList<DictObjectModel> filteredList = new ArrayList<DictObjectModel>();

            for (int i = 0; i < wordcombimelist.size(); i++) {

                final String text = wordcombimelist.get(i).toLowerCase();
                if (text.contains(newText)) {

                    filteredList.add(new DictObjectModel(wordcombimelist.get(i),meancombimelist.get(i)));
                }
            }
            adapter = new CustomAdapter(filteredList);
            recyclerView.setAdapter(adapter);


            return true;
        }
    });

SearchView 在 Android API 28 上有以下 OnEditorActionListener

private final OnEditorActionListener mOnEditorActionListener = new OnEditorActionListener() {

    /**
     * Called when the input method default action key is pressed.
     */
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        onSubmitQuery();
        return true;
    }
};

在我的调试器中,我看到 onEditorAction 被调用了 KeyEvent.action == KeyEvent.ACTION_DOWN,然后是 KeyEvent.action == ACTION_UP

这似乎是 SearchView 中的错误。