Android SearchView.OnQueryTextListener OnQueryTextSubmit not fired on empty query string

后端 未结 13 883
盖世英雄少女心
盖世英雄少女心 2020-12-05 10:17

I am using Android 4.1.2. I have a SearchView widget on an ActionBar. Documentation on SearchView.OnQueryTextListener

13条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-05 10:36

    This is a complete example written in Kotlin:

    import android.content.Context
    import android.text.TextUtils
    import android.util.AttributeSet
    import android.view.inputmethod.EditorInfo
    import android.widget.TextView
    import androidx.appcompat.widget.SearchView
    
    /**
     * Custom [SearchView] which can listen to empty submit events
     *
     * If the internal implementation would change, this will not crash at runtime. It will simply
     * ignore the empty submit listener and will continue to work as this is the base [SearchView]
     */
    class EmptySubmitSearchView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : SearchView(context, attrs, defStyleAttr) {
    
        private lateinit var searchAutoComplete: SearchAutoComplete
    
        private lateinit var internalEditorListener: TextView.OnEditorActionListener
    
        private var emptySubmitListener: OnEmptySubmitListener? = null
    
        init {
            try {
                val defaultListenerField = SearchView::class.java
                    .getDeclaredField("mOnEditorActionListener")
                defaultListenerField.isAccessible = true
                internalEditorListener = defaultListenerField.get(this) as TextView.OnEditorActionListener
    
                val searchAutoCompleteField = SearchView::class.java
                    .getDeclaredField("mSearchSrcTextView")
                searchAutoCompleteField.isAccessible = true
                searchAutoComplete = searchAutoCompleteField.get(this) as SearchAutoComplete
    
                searchAutoComplete.setOnEditorActionListener { v, actionId, event ->
                    if (actionId == EditorInfo.IME_ACTION_DONE && TextUtils.isEmpty(searchAutoComplete.text)) {
                        emptySubmitListener?.onEmptyTextSubmit()
                    } else {
                        internalEditorListener.onEditorAction(v, actionId, event)
                    }
                    true
                }
            } catch (ignored: Exception) {
                //Some internal field has changed. Check there is a field called
                //mSearchSrcTextView and mOnEditorActionListener and if not update them accordingly
            }
        }
    
        /**
         * Set custom empty listener or null to remove it
         */
        fun setOnEmptySubmitListener(listener: OnEmptySubmitListener?) {
            emptySubmitListener = listener
        }
    
        interface OnEmptySubmitListener {
            fun onEmptyTextSubmit()
        }
    }
    

    You can set a custom listener with setOnEmptySubmitListener which will enable you to distinguish between events.

    You can customize the actionId to respond to, in this case I had in my XML the EmptySubmitSearchView with this android:imeOptions="actionDone|flagNoExtractUi"

提交回复
热议问题