kotlin
配合 searchview
listpopupwindow
开始的代码
class SearchActivity : AppCompatActivity(), SearchContract.SearchUIView {
private lateinit var searchView: SearchView
private lateinit var historyRecord: MutableList<String>
private lateinit var popupWindow: ListPopupWindow
override fun onCreate(savedInstanceState: Bundle?) {
if(!searchView.isFocused){
val view = searchView
showListPopupWindow(view)
}
}
private fun showListPopupWindow(view :View){
popupWindow = ListPopupWindow(this)
popupWindow.run {
width = resources.displayMetrics.widthPixels
height = ListPopupWindow.MATCH_PARENT
setFinishOnTouchOutside(true)
setBackgroundDrawable(ColorDrawable(ContextCompat.getColor(this@SearchActivity,R.color.white_color)))
setAdapter(ArrayAdapter<String>(applicationContext,android.R.layout.activity_list_item,historyRecord))
setOnItemClickListener { parent, view, position, id ->
//把文字内容填充到searchveiw
popupWindow.dismiss()
}
anchorView = view
horizontalOffset = 0
verticalOffset = 0
isModal = true
}
searchView.setOnClickListener { popupWindow.show() }
}
}
错误1 :开始执行 showListPopupWindow()就黑屏
分析1
popupwindow 的触发事件不对,要想实现焦点在搜索框就会出现搜索历史提示功能,isFocused 是不能的。
isFocused 方法返回的永远是false
,因为它是真正拥有焦点的 SearchView,而不是 SearchView 本身。
所以我换了 popupwindow 的触发方法
searchView.setOnQueryTextFocusChangeListener { view, b ->
if (b){
val view = searchView
showListPopupWindow(view,db)
popupWindow.show()
}
}//焦点改变触发 popupwindow
错误2 :一开始还是 popupwindow 还是弹不出来
分析2
一开始 SearchView 的焦点没有改变,所以在这之前应该清除SearchView 的焦点
searchView.clearFocus()
错误3 :输一次东西 popupwindow 就会消失
分析3
popupwindow的消失问题,应该和dismiss()方法的调用有关,我希望点提交或者其他地方的时候popupwindow消失,所以
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
......
searchPresenter.loadSearchData(keyword, page)
hideInputKeyboard()
popupWindow.dismiss()
return true
}
override fun onQueryTextChange(newText: String): Boolean {
return false
}
})
错误4:一次只能输一个东西,必须要再点击搜索框才能继续再次输入一次
分析4
应该也是焦点问题,popupwindow 弹出来之后焦点就到 popupwindow 上了,应该使 popupwindow 不再自动获取焦点,找了很久都没有在 listpopupwindow 里找到这个方法,最后看源码发现,这个方法被封装到isModal了。
isModal = false//内部封装的是focused,设置成false才能是popupwindow不自动获取焦点
错误5 : 修改之后,只有在最开始点击搜索框的时候弹出popupwindow
分析5
因为我写的 popupwindow 的触发事件是 searchView 的焦点改变,为了保证我在点击其他地方再回到searchView的时候popupwindow依然能弹出来
popupWindow.apply {
setOnDismissListener {
searchView.clearFocus()
}
}
总结
主要是
焦点
问题,要考虑清楚怎么处理焦点,才能满足自己想要的功能