Пользовательские представления и атрибуты, используемые в приложениях Android - PullRequest
2 голосов
/ 11 января 2011

Я разработал несколько приложений для Android и создал кодовую базу классов, которую я часто использую в нескольких приложениях.Этот код находится в хранилище subversion (svn), каждое приложение находится в своем собственном хранилище.Затем каждое приложение имеет ссылки на svn: externals для необходимых пакетов (например, com.company.android.views).Это прекрасно работает, за исключением случая, когда класс R должен быть импортирован для пользовательских атрибутов.

У пользовательского представления есть импорт, подобный следующему:

import com.company.apps.myapp.R

, так что он может иметь такой кодthis:

attributes.getBoolean(R.styleable.WebImageView_autoload, autoload)

Этот пользовательский атрибут определен в res / values ​​/ attrs.xml:

<declare-styleable name="WebImageView">
    <attr name="autoload" format="boolean" />
    ...others
</declare-styleable>

Это отлично работает, но проблема возникает, когда у меня есть второе приложение, которое используетэто же мнение.Теперь я обновляю импорт до import com.company.apps.anotherapp.R, чтобы он работал с «anotherapp», а это нарушает «myapp».При работе с несколькими приложениями одновременно это становится проблемой.

Мое временное решение состояло в том, чтобы проверить наличие обновлений для соответствующих классов и затем привязать svn: externals к этой конкретной ревизии.В конечном итоге каждое приложение блокируется на другую ревизию, которая быстро запутывается, но это все же кажется лучше, чем непосредственное копирование различных классов в репозиторий приложения.

Единственное другое решение, о котором я думал, это использование отражениячто-то вроде:

Class class = Class.forName(context.getPackageName() + ".R");
Field[] fields = class.getDeclaredFields();

А затем переберите поля, присваивая те, которые мне нужны, переменным, которые используются во всем классе.Это кажется довольно сложным, особенно когда мы можем говорить о нескольких классах, нуждающихся в этом.

Как я могу решить эту проблему?Есть ли способ динамически импортировать com.company.apps. *. R или как-то сгенерировать другой класс R, который не зависит от конкретного приложения?Или есть какое-то другое очевидное (или не столь очевидное) решение, которое я полностью пропустил?

1 Ответ

0 голосов
/ 20 января 2011

Потребовалось немного времени, но я нашел хороший ответ: Библиотечные проекты .

Конструктивно проект библиотеки похож на проект стандартного приложения для Android.Например, он включает файл манифеста в корне проекта, а также src /, res / и аналогичные каталоги.Проект может содержать те же типы исходного кода и ресурсов, что и стандартный проект Android, которые хранятся таким же образом.Например, исходный код в проекте библиотеки может обращаться к своим собственным ресурсам через свой класс R.

...