我有一个SearchFragment 这是我在SearchFragment中的onCreateOptionMenu的代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.search_menu, menu)
val searchItem = menu.findItem(R.id.action_search)
val searchManager = activity?.getSystemService(Context.SEARCH_SERVICE) as? SearchManager
searchView = searchItem?.actionView as? SearchView
searchView?.setSearchableInfo(searchManager?.getSearchableInfo(activity?.componentName))
queryTextListener = object : SearchView.OnQueryTextListener {
override fun onQueryTextChange(newText: String): Boolean {
return true
}
override fun onQueryTextSubmit(query: String): Boolean {
viewModel.loadSearchResults(query)
return true
}
}
searchView?.setOnQueryTextListener(queryTextListener)
super.onCreateOptionsMenu(menu, inflater)
}
我想知道是否可以对菜单的SearchView进行数据绑定,因此,在我不想在Fragment中使用SearchView.OnQueryTextListener
的情况下,我可以将viewModel与菜单连接起来,并在ViewModel中监听searchView的更改
android:text="@={viewModel.query}"
答案 0 :(得分:0)
您是否尝试过将侦听器直接移到viewModel?
class ViewModel: ViewModel() {
interface ViewModelListener {
fun onQueryTextChange(newText: String)
fun onQueryTextSubmit(newQuery: String)
}
var listener: ViewModelListener? = null
var query = ObservableField<String>()
val queryTextListener = object : SearchView.OnQueryTextListener {
override fun onQueryTextChange(newText: String): Boolean {
listener?.onQueryTextChange(newText: String)
return true
}
override fun onQueryTextSubmit(newQuery: String): Boolean {
listener?.onQueryTextSubmit(newQuery: String)
query.set(newQuery)
return true
}
}
}
并在searchView?.setOnQueryTextListener(viewModel.queryTextListener)
之类的onViewCreated中分配它
您还可以添加监听器viewModel.listener = this