Android SearchView.OnQueryTextListener OnQueryTextSubmit未在空查询字符串上触发

tbo*_*rja 25 android searchview

我使用的是Android 4.1.2.我有一个SearchView小部件ActionBar.SearchView.OnQueryTextListener来自android开发者网站的文档指出,onQueryTextSubmit当"用户提交查询时调用.这可能是由于键盘上的按键或按下提交按钮所致."

如果搜索查询为空,则不会发生这种情况.我需要这个来触发一个空查询来清除ListView的搜索过滤器.这是一个错误还是我做错了什么?

Sam*_*Sam 14

它不是一个bug,源代码故意检查null和empty值:

private void onSubmitQuery() {
    CharSequence query = mQueryTextView.getText();
    if (query != null && TextUtils.getTrimmedLength(query) > 0) {
Run Code Online (Sandbox Code Playgroud)

但是,当用户清除搜索EditText时,您应该能够使用OnQueryTextChange回调来清除ListView的过滤器.

  • 感谢您对源代码的信息和研究.我相信即使查询文本为空也应该触发OnQueryTextSubmit,以允许我们清除搜索过滤器并重新显示整个未过滤的列表.即使我通过OnQueryTextChange事件跟踪查询文本,当搜索文本变空时也会出现问题.没有事件被解雇.我必须在Action栏上放置另一个菜单项才能重新显示整个未过滤的列表. (11认同)
  • 理由是:"它在源代码中,所以它不是一个bug"是完全有缺陷的. (5认同)

Jam*_*Tan 12

我有一个更容易的解决方法:使用onQueryTextChange,但只有渲染,如果它是空的.

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

            @Override
            public boolean onQueryTextChange(String newText) {
                    if (searchView.getQuery().length() == 0) {
                            renderList(true);
                    }
                    return false;
            }
    });
Run Code Online (Sandbox Code Playgroud)

  • 为什么你不使用“newText”而不是“searchView.getQuery()”? (2认同)

Pio*_*zan 10

我有同样的问题,最终得到以下解决方案:自定义SearchView+OnQueryTextListener.onQueryTextChange

自定义SearchView:

public class MySearchView extends SearchView {

private boolean expanded;

public MySearchView(Context context) {
    super(context);
}

@Override
public void onActionViewExpanded() {
    super.onActionViewExpanded();
    expanded = true;
}

@Override
public void onActionViewCollapsed() {
    super.onActionViewCollapsed();
    expanded = false;
}

public boolean isExpanded() {
    return expanded;
}
}
Run Code Online (Sandbox Code Playgroud)

创建操作并设置回调:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    searchAction = menu.add(0, SEARCH_ACTION_ID, 0 , getString(R.string.action_search));
    searchAction.setShowAsAction(SHOW_AS_ACTION_ALWAYS | SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);       
    searchView = new MySearchView(getSherlockActivity());
    searchView.setOnQueryTextListener(searchQueryListener);
    searchView.setIconifiedByDefault(true);
    searchAction.setActionView(searchView);
}
Run Code Online (Sandbox Code Playgroud)

最后听众:

private OnQueryTextListener searchQueryListener = new OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        search(query);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        if (searchView.isExpanded() && TextUtils.isEmpty(newText)) {
            search("");
        }

        return true;
    }

    public void search(String query) {
        // reset loader, swap cursor, etc.
    }

};
Run Code Online (Sandbox Code Playgroud)

测试ABS 4.3.

  • 看起来您实际上并不需要自定义SearchView(使用isExpanded()).isIconified()也会做同样的事情,尽管你只是反过来.如果isIconified()为true且newText为空,则用户刚刚打开SearchView,他们没有在搜索视图中明确清除文本.至少,这似乎适用于ABS 4.x. (2认同)

小智 9

我在SearchView上遇到了同样的问题.我的解决方案包括样式SearchView,如http://novoda.com/blog/styling-the-actionbar-searchview/指南所示,并为EditText设置OnEditorActionListener(当用户点击输入时如何触发操作?)是SearchView的一部分是这样的:

final SearchView searchView = (SearchView)findViewById(R.id.search);
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
EditText searchPlate = (EditText) searchView.findViewById(searchPlateId);
searchPlate.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            //Do something
        }
        return false;

    }});
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用v7 searchView,那么searchPlace id就是`R.id.search_src_text`,所以`EditText searchPlate =(EditText)searchView.findViewById(R.id.search_src_text)` (4认同)

Mik*_*iku 5

这是一个旧线程,但我找到了另一个解决方案(Kotlin 代码,但也适用于 Java):

override fun onQueryTextChange(newText: String?): Boolean {
            if(newText == null || newText.isEmpty())
                searchView.setQuery("\u00A0", false)
            return true
        }
Run Code Online (Sandbox Code Playgroud)

\u00A0是一个看起来像空格的字符,但在代码方面它不是。换句话说 SearchView 不是空的。空字符串或" "不起作用,因为基本 SearchView 使用修剪,加上用户可能想要搜索以空格结尾或开头的文本。但据我所知用户不能输入\u00A0字符。

然后你需要做的就是return super.getQuery.replace("\u00A0", "")在你的自定义 SearchView 中覆盖 getQuery