Написание тематических приложений в Android - PullRequest
6 голосов
/ 04 августа 2011

Я пишу приложение в Android и хочу, чтобы пользователи могли загружать темы и / или создавать их самостоятельно. Приложение поставляется с некоторыми изображениями по умолчанию, и либо темы могут быть установлены из Market / как другие APK, либо могут быть помещены на SDCard - либо все будет в порядке.

То, что я хочу, это: - разрешить темам переопределять изображения в кнопках - прямо сейчас у меня есть стили XML для таких вещей, как выделение при выборе (для фона кнопки + для комбинирования кнопки bg с реальными изображениями кнопки) - разрешить темам переопределять цвета фона и текста для определенных вещей (сейчас я не использую стили там, но могу, если это облегчит задачу)

Мне интересно, возможно ли просто переопределить определения стилей в onCreate моего Application / Activity на основе конфигурации - я не возражаю, если пользователь перезапустит приложение после изменения стиля.

Кроме того, если это будет другой APK, как мой основной APK получит его - путем перечисления пакетов и фильтрации по имени пакета?

Возможно, есть хороший урок об этом?

1 Ответ

4 голосов
/ 17 августа 2011

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

Первое, что вам нужно знать, это Context.createPackageContext (), который позволяет вам создавать Контекст для другого .apk (и таким образом загружать его ресурсы).Затем вы можете использовать этот контекст для загрузки изображений и тому подобного.Обратите внимание, что эти ресурсы полностью отличаются от ресурсов вашего собственного приложения, поэтому вы не можете использовать стандартные средства, такие как темы или тому подобное, для замены.Вам просто нужно будет вручную разместить код везде, где вы хотите загрузить «тематические» ресурсы, которые явно извлекают его из этого контекста.

Чтобы обнаружить доступные .apks (и, следовательно, имя пакета для использования с createPackageContext ()), вы можете использовать средства PackageManager для выполнения запросов к компонентам.Например, вы можете сказать, что каждая тема .apk будет иметь следующий вид:

<receiver android:name="something">
    <intent-filter>
        <action android:name="com.mydoman.action.THEME" />
    </intent-filter>
</receiver>

Теперь вы можете найти все .apks с такими получателями через PackageManager.queryBroadcastReceivers ():

http://developer.android.com/reference/android/content/pm/PackageManager.html#queryBroadcastReceivers(android.content.Intent, int)

Чтобы выбрать те, у которых есть вышеуказанные фильтры намерений, используйте намерение, созданное с помощью:

Intent intent = new Intent("com.mydoman.action.THEME");
...