Могу ли я использовать привязку данных для меню параметров в Android Studio? - PullRequest
1 голос
/ 29 апреля 2020

Следующий код взят из примеров архитектуры проекта, вы можете увидеть его здесь .

Я знаю, что могу использовать, например, viewDataBinding.viewmodel для доступа к элементу управления макетом или данным.

Но в следующем коде я нахожу, что val view = activity?.findViewById<View>(R.id.menu_filter) ?: return появляется, это традиционный код.

Есть ли способ получить доступ к меню опций с помощью технологии Databinding или Viewbinding

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>

1 Ответ

1 голос
/ 03 мая 2020

Как указано в документах :

Привязка к представлению - это функция, которая позволяет легче писать код, взаимодействующий с представлениями. Как только привязка вида включена в модуле, он генерирует класс привязки для каждого XML файла макета , присутствующего в этом модуле. Экземпляр класса привязки содержит прямые ссылки на все представления, имеющие идентификатор в соответствующем макете.

В большинстве случаев привязка представления заменяет findViewById.

Посмотрите на жирным шрифтом вы заметите, что View Binding работает только для макета XML (расположен в res/layout), тогда как меню расположены в res/menu.

Кроме того, View Binding использует findViewById, тогда как меню используйте menu.findItem(R.id.menu_id), таким образом, это невозможно.

...