我可以在Android Studio中使用数据绑定来处理选项菜单吗?

6
以下代码来自项目“architecture-samples”,您可以在这里看到。
我知道我可以使用viewDataBinding.viewmodel之类的方式来访问布局控件或数据。
但是在下面的代码中,我发现val view = activity?.findViewById<View>(R.id.menu_filter) ?: return出现了,这是传统的代码。
是否有一种方法可以使用DatabindingViewbinding技术访问选项菜单?
class TasksFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewDataBinding = TasksFragBinding.inflate(inflater, container, false).apply {
            viewmodel = viewModel
        }
        setHasOptionsMenu(true)
        return viewDataBinding.root
    }

    override fun onOptionsItemSelected(item: MenuItem) =
        when (item.itemId) {
            R.id.menu_clear -> {
                viewModel.clearCompletedTasks()
                true
            }
            R.id.menu_filter -> {
                showFilteringPopUpMenu()
                true
            }
            R.id.menu_refresh -> {
                viewModel.loadTasks(true)
                true
            }
            else -> false
        }


  private fun showFilteringPopUpMenu() {
        val view = activity?.findViewById<View>(R.id.menu_filter) ?: return

        PopupMenu(requireContext(), view).run {
            menuInflater.inflate(R.menu.filter_tasks, menu)

            setOnMenuItemClickListener {
                viewModel.setFiltering(
                    when (it.itemId) {
                        R.id.active -> TasksFilterType.ACTIVE_TASKS
                        R.id.completed -> TasksFilterType.COMPLETED_TASKS
                        else -> TasksFilterType.ALL_TASKS
                    }
                )
                true
            }
            show()
        }
    }

    ...
}


<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <import type="android.view.View" />

        <import type="androidx.core.content.ContextCompat" />

        <variable
            name="viewmodel"
            type="com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModel" />

    </data>
    ...
</layout>

数据绑定不支持选项菜单! - kaustubhpatange
1个回答

12

文档中所述:

视图绑定是一项功能,它使您更轻松地编写与视图交互的代码。启用模块中的视图绑定后,它将为该模块中存在的每个 XML 布局文件生成一个绑定类。绑定类实例包含对相应布局中具有 ID 的所有视图的直接引用

在大多数情况下,视图绑定替换了findViewById

注意加粗的字词,您会发现 View Binding 仅适用于 XML 布局(位于 res/layout 中),而菜单位于 res/menu 中,无法使用视图绑定进行绑定。

此外,View Binding 使用 findViewById,而菜单使用 menu.findItem(R.id.menu_id),因此也不可能使用视图绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接