ViewBinding - Ресурс разного вида макета

У меня есть вариант, содержащий тот же ресурс макета, что и в моем исходном наборе main. Это значит, что он заменяет основной на вкус, зависящий от вкуса. Я делал это во многих местах, и это прекрасно работает, пока я не представил ViewBinding. Для точности макет - это вложенный макет, который «включен» во фрагмент.

Вот структура:

main
 - res 
 - - layout 
 - - - layout_sign_up_details_fields.xml
flavor 
 - res 
 - - layout 
 - - - layout_sign_up_details_fields.xml

У меня есть представление с идентификатором til_sudf_first_name в моем конкретном ресурсе макета, которого у меня нет в моем основном ресурсе. Это задумано. Я вижу, что этот View "привязан" к моему классу привязки, просматривая сгенерированные источники при запуске этого варианта сборки.

@NonNull
public final TextInputLayout tilSudfFirstName;

Теперь фактическое связывание происходит в «базовом» классе и используется совместно с дочерними классами с помощью модификатора видимости protected следующим образом:

private var _binding : FragmentSignUpDetailsBinding? = null
protected val binding get() = _binding!!
protected val detailsBinding get() = binding.lSudfDetails

Проблема в том, что detailsBinding не содержит требуемого мне представления, хотя оно присутствует в сгенерированном классе.

Вдобавок другая странность заключается в том, что даже несмотря на то, что в файле макета main есть представления, которых нет в файле макета для конкретного варианта, они все равно включаются в сгенерированный файл макета.

Возможно ли то, что я пытаюсь сделать? Доступный мне обходной путь - использовать обработку синтетического представления kotlin для этого экземпляра, как и я, но я пытался использовать рекомендуемый подход.


person StuStirling    schedule 05.03.2020    source источник
comment
На данный момент мне пришлось пойти по старой школе в моем классе, зависящем от вкуса, и использовать findViewById для ссылки на представление, зависящее от вкуса.   -  person StuStirling    schedule 17.03.2020


Ответы (1)


Хитрость заключается в том, чтобы использовать одно общее имя пакета для ваших фрагментов и моделей просмотра:

main
 - java
 - - MainFragment (package com.rahul.sample.<..>)
 - - MainViewModel (package com.rahul.sample.<..>)

flavor
 - java
 - - FlavorFragment (package com.rahul.sample.<..>)
 - - FlavorViewModel (package com.rahul.sample.<..>)

Так работает привязка.

person JuliaKo    schedule 06.08.2020