Android 如何修改SearchView关闭/清除按钮以始终关闭搜索框,无论其是否包含内容?

Android 如何修改SearchView关闭/清除按钮以始终关闭搜索框,无论其是否包含内容?,android,searchview,Android,Searchview,如果searchview包含一些文本,则不会调用此方法。它仅在搜索框为空时调用 更新: mSearchView.setOnCloseListener { // do something } <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"

如果searchview包含一些文本,则不会调用此方法。它仅在搜索框为空时调用

更新:

mSearchView.setOnCloseListener {
      // do something
}
    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_scrolltotop"
        android:icon="@drawable/ic_baseline_arrow_upward_24_white"
        android:title="@string/action_scrolltotop"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="@string/action_search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="always" />
</menu>
菜单xml:

mSearchView.setOnCloseListener {
      // do something
}
    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_scrolltotop"
        android:icon="@drawable/ic_baseline_arrow_upward_24_white"
        android:title="@string/action_scrolltotop"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="@string/action_search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="always" />
</menu>

我使用导航组件,所以我从一个片段中膨胀菜单

onCreateOptions菜单(来自片段):

mSearchView.setOnCloseListener {
      // do something
}
    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_scrolltotop"
        android:icon="@drawable/ic_baseline_arrow_upward_24_white"
        android:title="@string/action_scrolltotop"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="@string/action_search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="always" />
</menu>
覆盖创建选项菜单(菜单:菜单,充气机:菜单充气机){
super.onCreateOptions菜单(菜单,充气机)
充气机。充气(右菜单。菜单记忆工具,菜单)
val mSearch=menu.findItem(R.id.action\u搜索)
mSearchView=mSearch.actionView作为搜索视图
mSearchView.setOnSearchClickListener{
memoriesScrollView.smoothScrollTo(0,0)
}
val closeBtn=mSearchView.findviewbyd(R.id.search\u close\u btn)
closeBtn?.setOnClickListener{
mSearchView.setQuery(“,false)
mSearchView.isIconified=true
}
mSearchView.setOnQueryTextListener(对象:SearchView.OnQueryTextListener{
...
}
}

您可以使用以下命令修改关闭/清除功能:

在类中声明变量ImageView

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    super.onCreateOptionsMenu(menu, inflater)

    inflater.inflate(R.menu.menu_memories_tools, menu)

    val mSearch = menu.findItem(R.id.action_search)
    mSearchView = mSearch.actionView as SearchView

    mSearchView.setOnSearchClickListener {
        memoriesScrollView.smoothScrollTo(0, 0)
    }

    val closeBtn = mSearchView.findViewById<ImageView>(R.id.search_close_btn)
    closeBtn?.setOnClickListener {
        mSearchView.setQuery("", false)
        mSearchView.isIconified = true
    }

    mSearchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        ...
    }
}

确保您的androidx.appcompat.widget.SearchViewXML中有
app:iconifiedByDefault=“true”

解决方案

private var closeButton: ImageView? = null

closeButton = mSearchView.findViewById(androidx.appcompat.R.id.search_close_btn)
        closeButton?.setOnClickListener {
          mSearchView.onActionViewCollapsed() 
        }
val closeBtnId=mSearchView.context.resources
.getIdentifier(“android:id/search\u close\u btn”,null,null)
val closeBtn=mSearchView.findviewbyd(closeBtnId)
closeBtn?.setOnClickListener{
mSearchView.onActionViewCollapsed()
}

您可以通过充气关闭按钮,并在其
onClick
回调中:

  • 通过
    searchView.setQuery

  • 通过
    searchView.setIconified(true)

爪哇:

科特林

View closeBtn = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
closeBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        searchView.setQuery("", false); // reset Query text to be empty without submition 
        searchView.setIconified(true); // Replace the x icon with the search icon
    }
});

searchView.findviewbyd返回null(我使用的是android.widget.searchView,所以您的答案应该有效),我在fragment@BotondSulyok你能在onCreateOptionMenu中显示菜单xml文件和代码吗?@BotonSulyok请查看我的更新答案。谢谢,它解决了我的问题。很高兴能帮助你。