是否可以使用searchView对操作菜单进行数据绑定?

时间:2019-08-23 15:00:30

标签: android android-databinding android-optionsmenu

我有一个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}"

1 个答案:

答案 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