Android ActionMode-SearchView不工作(actionView为空)

Android ActionMode-SearchView不工作(actionView为空),android,kotlin,android-menu,android-actionmode,Android,Kotlin,Android Menu,Android Actionmode,最近,当用户在onOptionsItemSelected中单击Search时,我正在ActionMode中激活SearchView 但是,我无法访问SearchView,因为调试后,它的actionView显然是空的。有人能帮我吗 override fun onOptionsItemSelected(item: MenuItem): Boolean { R.id.chat_search -> { if (searchActionMode == null) {

最近,当用户在
onOptionsItemSelected
中单击Search时,我正在
ActionMode
中激活
SearchView

但是,我无法访问
SearchView
,因为调试后,它的
actionView
显然是空的。有人能帮我吗

override fun onOptionsItemSelected(item: MenuItem): Boolean {
     R.id.chat_search -> {
          if (searchActionMode == null) {
             searchActionMode = startActionMode(searchActionModeCallBack)
          }
}
ActionModeCallBack

private val searchActionModeCallBack = object: ActionMode.Callback {
        private lateinit var mSearchView: SearchView

        override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
            menuInflater.inflate(R.menu.menu_search_message, menu)

            moreMenuBtn.isVisible = false
            layout_chatbox.hide()

            return true
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
            val searchItem = menu?.findItem(R.id.search_item_btn)
            if(searchItem?.actionView != null) {      <---- this seachview.actionView keeps return null
                mSearchView = searchItem.actionView as SearchView
                mSearchView.isIconified = false

                mSearchView.onQueryTextChanged { newText ->

                }
            }

            return true
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
            when(item?.itemId) {
                R.id.search_item_up -> {
                    "UP".showToast(this@ChatActivity)
                }
                R.id.search_item_down -> {
                    "DOWN".showToast(this@ChatActivity)
                }
                R.id.search_item_btn -> {
                    "SEARCH".showToast(this@ChatActivity)    <-- when click on "Search" Button, "Search" is toasted.
                }
            }
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {
            searchActionMode = null
            moreMenuBtn.isVisible = true
            layout_chatbox.show()
        }

    }
private val searchActionModeCallBack=对象:ActionMode.Callback{
私有lateinit var mSearchView:SearchView
重写FunonCreateActionMode(模式:ActionMode?,菜单:菜单?):布尔值{
菜单充气器。充气(右菜单。菜单搜索消息,菜单)
moreMenuBtn.isVisible=false
layout_chatbox.hide()
返回真值
}
覆盖PrepareActionMode(模式:ActionMode?,菜单:菜单?):布尔值{
val searchItem=菜单?.findItem(R.id.search\u item\u btn)
如果(searchItem?.actionView!=null){
}
}
返回真值
}
覆盖已单击的ActionItem(模式:ActionMode?,项目:MenuItem?):布尔值{
何时(项目?.itemId){
R.id.search\u项目\u up->{
“起来”,敬酒(this@ChatActivity)
}
R.id.search\u项目\u向下->{
“倒下”,摊牌(this@ChatActivity)
}
R.id.search\u item\u btn->{

“搜索”,展示(this@ChatActivity)我以前也遇到过同样的问题,对我来说有效的是以编程方式设置
ActionView
,而不是在菜单xml中

为此:

首先:从菜单中删除操作
ViewClass

<?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">

    <group android:id="@+id/group_search_mode">

        <item
            android:id="@+id/search_item_btn"
            android:icon="@drawable/ic_baseline_search_24"
            app:showAsAction="always"
            android:title="@string/search"/>
...

我有办法解决这个问题。 在我的例子中,我将在actionMode的标题中添加一个
customview
。 这是我的解决办法

override fun onOptionsItemSelected(item: MenuItem): Boolean {
     R.id.chat_search -> {
          if (searchActionMode == null) {
             searchActionMode = startActionMode(searchActionModeCallBack)
             val view = layoutInflater.inflate(R.layout.custom_searchview, null)
             searchActionMode?.customView = view   <-- ADD YOUR CUSTOM VIEW

             val etSearch = view.findViewById<EditText>(R.id.et_search)
             etSearch.requestFocus()
             etSearch.doOnTextChanged { text, start, before, count ->
                  // TODO - handle the search query here
             }
   }
}
覆盖选项ItemSelected(项:MenuItem):布尔值{
R.id.chat\u搜索->{
if(searchActionMode==null){
searchActionMode=startActionMode(searchActionModeCallBack)
val view=LAYOUTINGFLATER.充气(R.layout.custom_searchview,null)
searchActionMode?.customView=view
//TODO-在此处处理搜索查询
}
}
}
自定义_searchview.xml(只是一个简单的编辑文本)


菜单\u search\u message.xml(删除搜索视图项)


最终输出将如下所示


您好,这是启用
搜索视图
基本功能的一个非常好的解决方案。但就我而言,我希望在启用
搜索视图
时保留另一个菜单项。我已将我的解决方案附在下面,如果我做了任何错事,您可以查看并发表意见。做得好。但是为什么不添加
androidx.appcompat.widget.SearchView
而不是布局中的
EditText
。它将比
EditText
更方便搜索功能。谢谢你的建议!我在应用修复程序时没有考虑
SearchView
。它现在在customView中的
SearchView
很有魅力:)@Zain顺便说一句,可以吗你帮我修正我的问题?因为我需要在StackOverFlow获得更多的声誉:)。感谢你的帮助。
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_search_message, menu)

    moreMenuBtn.isVisible = false
    layout_chatbox.hide()
    
    // Step 2:
    val searchView = SearchView(this)
    searchView.setQuery(null, true)
    searchView.queryHint = "Search"

    // Step 3:
    val searchItem = menu?.findItem(R.id.search_item_btn)
    searchItem.setActionView(searchView)

    return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
     R.id.chat_search -> {
          if (searchActionMode == null) {
             searchActionMode = startActionMode(searchActionModeCallBack)
             val view = layoutInflater.inflate(R.layout.custom_searchview, null)
             searchActionMode?.customView = view   <-- ADD YOUR CUSTOM VIEW

             val etSearch = view.findViewById<EditText>(R.id.et_search)
             etSearch.requestFocus()
             etSearch.doOnTextChanged { text, start, before, count ->
                  // TODO - handle the search query here
             }
   }
}
<RelativeLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" >

    <EditText
        android:id="@+id/et_search"
        android:layout_alignParentStart="true"
        android:maxLines="1"
        android:ellipsize="end"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:padding="10dp"
        android:layout_marginEnd="50dp"
        android:hint="Search..."
        android:textColorHint="@color/colorWhite"
        android:textColor="@color/colorWhite"/>


</RelativeLayout>
<?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-->         <-- remove the searchView from xml
<!--        android:id="@+id/search_item_btn"-->
<!--        android:icon="@drawable/ic_baseline_search_24"-->
<!--        android:title="@string/search"-->
<!--        android:enabled="true"-->
<!--        android:actionLayout="@layout/custom_searchview"-->
<!--        app:showAsAction="collapseActionView|always" />-->

    <item
        android:id="@+id/search_item_up"
        android:icon="@drawable/ic_baseline_arrow_drop_up_24"
        android:orderInCategory="2"
        android:title="@string/up"
        app:showAsAction="always" />

    <item
        android:id="@+id/search_item_down"
        android:icon="@drawable/ic_baseline_arrow_drop_down_24"
        android:orderInCategory="3"
        android:title="@string/down"
        app:showAsAction="always" />


</menu>