【问题标题】:Is it possible to have databinding for action menu with searchView?是否可以使用 searchView 对操作菜单进行数据绑定?
【发布时间】:2019-08-23 15:00:30
【问题描述】:

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

【问题讨论】:

    标签: android android-databinding android-optionsmenu


    【解决方案1】:

    您是否尝试将侦听器直接移动到 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
           }
       }
    }
    

    并在您的 onViewCreated 中分配它,例如 searchView?.setOnQueryTextListener(viewModel.queryTextListener)

    你也可以添加监听器viewModel.listener = this

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 2019-10-20
      • 2013-07-28
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多