Какая необходимость вызывать DataBindingUtil.setContentView() при использовании библиотеки привязки данных?

Я учусь использовать библиотеку привязки данных. Я узнал, что это устраняет необходимость вызывать findViewById() вручную и делает код более надежным и читабельным.

Чтобы понять использование, я сделал следующее:

  1. сделал temp_layout.xml, который содержит 2 текстовых представления с идентификаторами «tv1» и «tv2»

  2. добавил тег <layout> в качестве корня

  3. нажал "создать проект"

Теперь я обнаружил, что доступен новый класс TempLayoutBinding, содержащий переменные tv1 и tv2.

Мой вопрос заключается в следующем, даже если я уже указал тег <layout> в temp_layout.xml, почему мне все еще нужно вызывать mBinding = DataBindingUtil.setContentView(...)? Что конкретно он делает?


person fsljfke    schedule 16.08.2017    source источник
comment
а почему ты звонишь Activity#setContentView ? то это та же самая причина, по которой вы звоните DataBindingUtil#setContentView   -  person pskink    schedule 16.08.2017
comment
@pskink Я думаю, что в случае активности нам нужно указать, какой файл макета раздувать. Но в случае привязки данных я уже определил тег <layout>. (Он даже получил переменные, пройдя через идентификаторы представлений). Так не должен ли сгенерированный класс привязки уже знать, о каком макете я говорю? Я прав?   -  person fsljfke    schedule 16.08.2017
comment
см. это и это, обратите внимание на строку #276   -  person pskink    schedule 16.08.2017
comment
Таким образом, это означает, что «это просто так, как это закодировано». В случае действия Activity#setContentView помогает отображать представление. При привязке данных DataBindingUtil#setContentView не должен играть роли в рендеринге пользовательского интерфейса, поскольку действие уже вызывает этот метод внутри себя. Поэтому я не думаю, что причина точно такая же и в этом случае.   -  person fsljfke    schedule 16.08.2017
comment
Хорошо, может быть, это правда. Но тогда что делает тег <layout>?   -  person fsljfke    schedule 16.08.2017
comment
в чем твоя проблема на самом деле?   -  person pskink    schedule 16.08.2017
comment
если вы не хотите использовать DataBindingUtil#setContentView, вы все равно можете использовать Activity#setContentView, но вам также нужно будет вызвать метод DataBindingUtil#bind   -  person pskink    schedule 16.08.2017
comment
если вы используете kotlin-extension, он также удаляет findViewById(). И вы можете напрямую получить доступ к идентификатору в макете.   -  person c-an    schedule 14.05.2019


Ответы (2)


Что делает обычный setContentView(layoutRes), так это отображает ваш пользовательский интерфейс в текущей активности и расширяет его до представления, которое добавляется в контекст активности, поэтому вы можете вызывать findViewById и другие методы поверх расширенного макета.

В привязке данных обычный setContentView(layoutRes) заменяется на DataBindingUtil.setContentView(context, layoutRes), он делает все вышеперечисленное, плюс создает объект привязки, выполняет findViewById и все другие задачи, связанные с привязкой данных, и дает вам объект привязки, который готов к использованию.

person SniperDW    schedule 16.08.2017
comment
Если DataBindingUtil#setContentView выполняет всю необходимую работу, остается только один вопрос: какова роль тега <layout>? Что именно он делает? - person fsljfke; 16.08.2017
comment
@vaibhavS Я считаю, что он указывает библиотеке привязки данных на макет, поэтому он создает класс TempLayoutBinding, чтобы вы могли использовать его в коде Java. - person SniperDW; 16.08.2017

DataBindingUtil.setContentView() установить представление содержимого действия в заданный макет и вернуть связанную привязку. Это то же самое, что и Activity setContentView().

Если вы не позвоните DataBindingUtil.setContentView() или setContentView(), вы получите только пустой экран.

person Vinayak B    schedule 16.08.2017
comment
Активность, которой принадлежит макет, уже будет вызывать Activity#setContentView. Так что не должно быть пустого экрана. Представления могут быть не установлены, но они должны по крайней мере существовать (и, вероятно, отображать их значение по умолчанию). Вам не кажется? - person fsljfke; 16.08.2017
comment
Вам не нужно вызывать Activity#setContentView, если вы используете DataBinding. Единственное, что вам нужно вызвать, это DataBindingUtil.setContentView(). Этот набор представляет собой представление вашей активности, а также привязывает ваше представление. - person Vinayak B; 16.08.2017