Расширение стиля/темы внешнего приложения

Я хочу определить стиль Android, который расширяет стиль, определенный в другом приложении/пакете, не импортированном как библиотека.

Из определения ссылки xml на ресурс Android здесь:

@[<package_name>:]<resource_type>/<resource_name>

кажется, что можно указать внешний , где определяется ресурс (используемый для ссылки на системный ресурс @android:string/name)

Теперь у меня есть основное приложение (package: com.example.test), которое определяет атрибут и тему следующим образом:

<declare-styleable name="TestAttrs">
    <attr name="testColor" format="color" />
</declare-styleable>

<style name="TestTheme" parent="@android:style/Theme">
    <item name="testColor">#FFFF0000</item>
</style>

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

 <style name="SubTheme" parent="@com.example.test:style/TestTheme">
    <item name="com.example.test:testColor">#FF00FF00</item>
 </style>

можно ли указать компилятору, где искать пакет?

Должен ли я определять свой первоначальный стиль/атрибуты как общие?


person Mario Lenci    schedule 16.09.2013    source источник


Ответы (2)


Вы объявили пространство имен:

<resources xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:com.example.test="...external resource's namespace">
person Szymon    schedule 16.09.2013
comment
как бы вы определили пространство имен внешних ресурсов? я пробовал так: schemas.android.com/apk/res/com.example .тест - person Mario Lenci; 16.09.2013
comment
Не уверен, есть ли у вас доступ к внешнему коду? Он должен быть там. Например, для адмоба мне пришлось сделать xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads" - person Szymon; 16.09.2013
comment
да у меня есть доступ. На данный момент я только играю с тестовыми проектами, чтобы заставить его работать, прежде чем начать с ним серьезно работать. - person Mario Lenci; 16.09.2013

package_name относится не к внешним приложениям на устройстве, а к другим пакетам проектов библиотек, которые вы создаете (каждый из которых имеет свою собственную таблицу ресурсов, которая затем объединяется).

Для доступа к частным ресурсам во внешних приложениях вы можете использовать PackageManager.getResourcesForApplication() или выставьте ContentProvider и сделайте это самостоятельно.

person Chris Banes    schedule 18.09.2013
comment
хорошо, я знал, что могу получить ресурс по коду, но мне нужно было получить к ним доступ по xml. Знаете ли вы способ предоставить известный внешний пакет пространству имен xml? - person Mario Lenci; 18.09.2013
comment
Нет способа (насколько я знаю). - person Chris Banes; 19.09.2013
comment
я спрашивал его о причине этого проекта скина powerAmp: >github.com/maxmpz/powerampapi/blob/master/poweramp_skin_sdk/ они этим занимаются. Но я не понимаю, как они его построили. - person Mario Lenci; 19.09.2013
comment
Похоже, они устанавливают идентификаторы в файле public.xml каждого скина, а затем ссылаются на них в приложении с помощью вызова PackageManager.getResourcesForApplication(), а затем используют идентификатор (0x80050000 и т. д.). - person Chris Banes; 20.09.2013