Я разработал несколько приложений для 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, который не зависит от конкретного приложения?Или есть какое-то другое очевидное (или не столь очевидное) решение, которое я полностью пропустил?