Переопределить макет и сгенерированный класс привязки данных на Android - PullRequest
0 голосов
/ 12 июня 2019

При разработке моего приложения у меня возникает следующая ошибка:

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

Давайте представим следующий сценарий:

LibraryA:

  • Привязка данных включена

  • Создать LibActivityA и layout_A.xml (корневой тег есть)

  • Внутри LibActivityA используйте LayoutABinding по своей воле

AppB:

  • зависимость от LibraryA

  • привязка данных включена

  • Некоторая активность внутри AppB запускает LibActivityA, и все работает нормально (без изменений макета по сравнению с LibraryA)

  • Я делаю релиз apk и могу правильно его использовать

APPC:

  • зависимость от LibraryA

  • привязка данных включена

  • У меня есть запрос на перемещение элемента, найденного в layout_A.xml, в нижнюю часть экрана, скажем

  • Я создаю другой файл layout_A.xml (корневой тег есть) и настраиваю то, что нужно (сохраняя все остальные элементы, чтобы избежать ошибок времени выполнения).

  • Я запускаю приложение и во время выполнения получаю исключение приведения класса

  • Быстрый поиск Я обнаружил, что сгенерированное LayoutABinding находится в моем пакете приложения, поэтому я использую https://developer.android.com/topic/libraries/data-binding/generated-binding#custom_binding_class_names, чтобы переместить LayoutABinding в тот же пакет, который найден в LibraryA.

  • снова запустите приложение, и все в порядке, бутылки с шампанским вышли!

  • Нажмите Генерировать apk, чтобы выполнить сборку релиза, и получите следующую ошибку: Не удалось выполнить задачу ': app: transformDexArchiveWithDexMergerForVariantStoreRelease'.

    com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: ошибка при объединении декс-архивов: Узнайте, как решить проблему в https://developer.android.com/studio/build/dependencies#duplicate_classes. Тип программы уже представлен: com.company.librarya.databinding.LayoutABinding

Я искал весь StackOverflow и Интернет, и, похоже, никому не удалось успешно сделать то, что я хочу: переписать файл ресурсов из библиотеки, которая использует dataBinding, чтобы немного отличаться для некоторых приложений, использующих lib. Перед использованием привязки данных все прошло гладко, действительно, я должен был убедиться, что findViewByIds не вернул null, и поэтому я мог использовать новые макеты.

1 Ответ

0 голосов
/ 12 июня 2019

Каким-то образом я начал копаться в реализации классов DataBinding и исключал ошибки одну за другой. Я закончил тем, что сделал:

APPC:

  • Я создаю другой файл layout_A.xml, НО корневой тег больше НЕ является таким, поэтому он не дает исключения приведения класса; Я настраиваю то, что нужно внутри файла макета.

  • LibActivityA использует DataBindingUtil.setContentView (), поэтому после слияния ресурсов R.layout.layout_A будет из AppC

  • внутри layout_A.xml из AppC Я вручную установил теги для представлений: корневой тег получает тег = "layout / layout_A_0", любые прямые дочерние элементы типа ViewGroup получают тег = "binding_ [дочерний номер]".

Установка тегов вручную, похоже, заставляет последние сгенерированные классы DataBinding работать должным образом. Я очень уверен, что это не способ сделать это, но это единственный способ, который я нашел без полного удаления привязки данных: (

Я очень уверен, что мы не должны использовать библиотеку DataBinding, поэтому я открыл тикет здесь: https://issuetracker.google.com/issues/135043330

...