如何在安卓中获取SearchView的事件

27

我在我的应用程序中使用了一个搜索视图。现在,我只想获取在SearchView文本框中输入的文本,并在另一个文本视图中显示它。如果我输入了文本并单击按钮,我可以做到相同的事情。但我不想使用任何额外的按钮。我只希望在按下回车键时显示结果。


我尝试了很多监听器,但它们都没有起作用。我不知道原因是什么... - andro-girl
7个回答

54

尝试使用SearchView的setOnQueryTextListener

new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextChange(String newText) {
        // your text view here
        textView.setText(newText);
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        textView.setText(query);
        return true;
    }
}

2
它正常工作了。您首先必须向您的搜索视图添加一个监听器。 - Asim
2
不管有没有监听器,当输入的字符串为空时,onQueryTextSubmit都不起作用。 - Yoann Hercouet
@HighFlyer,搜索视图展开并显示键盘后,是否有任何事件在其加载时触发?我已经苦苦挣扎了很长时间。[问题链接] (https://dev59.com/9Oo6XIcBkEYKwwoYIAof#25158420) - Pradeep Sharma

25

上面的回答很好,但实际上它并不完整,你需要为你的搜索视图设置一个操作监听器。你可以通过两种方式来实现这一点:创建一个实现必要类以成为OnQueryTextListener的类,并创建该类的新对象并将其用作搜索视图查询文本侦听器,或使用以下紧凑形式:

        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                callSearch(query);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
//              if (searchView.isExpanded() && TextUtils.isEmpty(newText)) {
                    callSearch(newText);
//              }
                return true;
            }

            public void callSearch(String query) {
                //Do searching
            }

        });

7

使用Jake Wharton的RXAndroid和RxBinding,也可以这样实现:

RxSearchView.queryTextChanges(searchView)
            .debounce(500, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<CharSequence>() {
                @Override
                public void call(CharSequence charSequence) {
                    if(charSequence!=null){
                        // Here you can get the text
                        System.out.println("SEARCH===" + charSequence.toString());
                    }
                }
            });

代码正在订阅文本更改,延迟时间为500毫秒。

这是获取RXAndroid的git仓库链接: https://github.com/JakeWharton/RxBinding


6
在 Kotlin 中,你可以进行以下操作:
searchView.setOnQueryTextListener(object : OnQueryTextListener {

    override fun onQueryTextChange(newText: String): Boolean {
        return false
    }

    override fun onQueryTextSubmit(query: String): Boolean {
        // task HERE
        return false
    }

})

3
正确的解决方法是使用 setOnQueryTextListener。 这是一个使用 Kotlin 的小例子:
txtSearch = rootView.searchView 
txtSearch.setOnQueryTextListener(object : SearchView.OnQueryTextListener {

        override fun onQueryTextChange(newText: String): Boolean {
            return false
        }

        override fun onQueryTextSubmit(query: String): Boolean {
            return false
        }
 })

虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - double-beep

1
使用扩展函数,创建 SearchViewExtensions.kt 文件。
import android.view.View
import androidx.appcompat.widget.SearchView

inline fun SearchView.onQueryTextChanged(crossinline listener: (String) -> Unit) {
    this.setOnQueryTextListener(object: SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            return true
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            listener(newText.orEmpty())
            return true
        }
    })
}

在你的片段中,有魔力

mSearchView.onQueryTextChanged { query: String ->
     // do whatever
}

我刚为我的项目做了相同的扩展!!但我不知道.orEmpty()方法。谢谢 :D - Leonardo Sibela

1

这是我在主活动中的onCreateOptionsMenu(Menu menu)函数中拥有的内容:

MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        // Do whatever you need. This will be fired only when submitting.
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        // Do whatever you need when text changes. 
        // This will be fired every time you input any character.
        return false;
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接