Intereting Posts
У Android Studio есть инструмент анализатора памяти, такой как MAT в Eclipse? Как запустить команду терминала в приложении Android? Политика конфиденциальности приложений для Android Исправлена ​​прокрутка фонового изображения на мобильных сенсорных устройствах сразу не обновляется Android.widget.LinearLayout не может быть добавлен в android.widget.TextView Парсер Android SAX не получает полный текст между тегами Как обнаружить все устройства, подключенные в сети WiFi от приложения Android Как я могу узнать, какую версию поддержки Android версии v4 я использую? Как напрямую перемещать камеру в текущее местоположение в Google Maps Android API v2? Как решить проблему с инициализацией API Firebase (Android + Firebase) Как написать файл .txt в Android? Android; Геокодер, почему я получаю «услуга недоступна»? Android: запуск службы с параметром Как печатать локальный часовой пояс в posix формате в java (android)? Добавить java-библиотеку в проект Android Studio с репозиторием maven

Общий код для различных андроидов

Я создаю 4 разных вкуса своего приложения для Android.

У меня есть класс Customization.java который одинаковый для 3 из них и отличается для 1.

Поскольку я не могу поместить тот же класс как в основную папку, так и в папку с ароматом, теперь я должен поддерживать 3 копии одного и того же класса для этих 3 вкусов.

Есть ли способ, которым я мог бы заниматься только двумя версиями этого класса?

Вещи, которые я рассмотрел до сих пор:

  1. Я посмотрел на размеры вкуса, но оказывается, что в этом случае они неприменимы.
  2. Сохранение только одного файла в одном из вкусов и копирование его через мой скрипт сборки.

Мне интересно, есть ли что-то более чистое из коробки.

Solutions Collecting From Web of "Общий код для различных андроидов"

Я хотел бы преобразовать комментарий CommonsWare в ответ. Затем я объясню, как должна выглядеть конечная установка каталога. Надеюсь, это поможет людям наткнуться на этот вопрос путем поиска.

Ну, вы можете переопределить ресурсы в ароматах. Итак, у вас есть общий в main/res/layout/ и специфичный для yourFlavorHere/res/layout/ вкуса в yourFlavorHere/res/layout/ .

Таким образом, если файл макета деятельности по Customization называется activity_customization.xml , вы оставите его общую копию, совместно используемую тремя вариантами в каталоге src/main/res/layout и поместите модифицированный макет xml, который будет использоваться, скажем, flavorFour , под Его соответствующий каталог исходного набора src/flavorFour/res/layout .

Способ, которым это работает, заключается в том, что, поскольку ароматы от одного до трех (в отличие от вкуса четыре) не предоставили своих собственных версий activity_customization.xml , они наследуют тот, который поступает из main источника.

Это класс активности Java, который становится сложным. Другая возможность для этого состоит в том, чтобы настроить ароматы с той же самой реализацией, чтобы вытащить из двух исходных каталогов: специфичный для вкуса и общий с общей реализацией класса.

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

Чтобы решить эту проблему, самым простым решением является перемещение деятельности по Customization из main и каждого набора источников аромата. Это работает, потому что каталоги вкуса являются взаимоисключающими (друг с другом, а не с main ), поэтому избегают конфликта.

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

Таким образом, скрипт build.gradle будет выглядеть примерно так:

 android { ... productFlavors { flavorOne { ... } flavorTwo { ... } flavorThree { ... } flavorFour { ... } } sourceSets { flavorOne.java.srcDir 'src/common/java' flavorTwo.java.srcDir 'src/common/java' flavorThree.java.srcDir 'src/common/java' } } 

Обратите внимание на использование java.srcDir (а не srcDirs ), который добавляет другой исходный каталог Java к уже существующей умолчанию src/flavorX/java .

Теперь все, что нам нужно сделать, – это сбросить общий файл активности Customization в src/common/java чтобы сделать его доступным для вкусов от одного до трех. Модифицированная версия, требуемая flavorFour будет flavorFour под собственным источником, установленным в src/flavorFour/java .

Итак, окончательная структура проекта будет выглядеть примерно так:

 + App // module |- src |- common // shared srcDir |- java |- path/to/pkg |- CustomizationActivity.java // inherited by flavors 1, 2, 3 + flavorOne + flavorTwo + flavorThree + flavorFour |- java |- path/to/pkg |- CustomizationActivity.java // per-flavor activity class |- res |- layout |- activity_customization.xml // overrides src/main/res/layout |- main + java |- res |- layout |- activity_customization.xml // inherited by flavors 1, 2, 3