Применение темы к appwidget
Я пытаюсь определить тему для appwidget и применить его на уровне приложения. У меня есть тема, как,
<style name="theme.dark">
<item name="android"background">#000000</item>
</style>
в моем манифесте я установил android:theme="@style/theme.dark"
в приложении. однако, когда я запускаю appwidget, он не выбирает элементы из стиля. я пытался установить style="@style/theme.dark"
на отдельный элемент в моем макете, и это работает... но это не то, что я хочу. я не хочу вызывать определенный стиль ="..." для каждого элемента в моем представлении. эта страница,
http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html
имеет отличный пример приложения для использования тем / стилей, и он отлично работает. единственное отличие состоит в том, что это приложение... и оно устанавливает тему для действия, а не приложение.
я также попытался установить тему программно на объекте Context, используя setTheme(...) в onHandleUpdate() appwidget, до того, как к представлению будет получен доступ. это тоже не работает.
есть идеи? Благодарю.
5 ответов
Ответ в том, что вы не можете применить тему динамически к appwidget. нет другого решения, кроме как предоставить несколько макетов, каждая из которых статически ссылается на определенную тему, а затем выбрать правильную тему / макет при создании удаленных представлений.
Поскольку мы не можем использовать тему динамически для приложения, я предлагаю следующее простое решение - просто переключаться между файлами макетов:
Предположим, у нас есть два разных макета:
- layout1.xml
- layout2.xml
Мы устанавливаем наш макет следующим образом:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout1);
И когда нам нужно, мы переключаем его на второй:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout2);
Это решение отлично работает для меня.
Использование style="@android:style/
Widget.(THEME).(CONTROLTYPE)
"
в соответствующем макете, например, Холо на кнопке:
<Button
android:id="@+id/button1"
style="@android:style/Widget.Holo.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
style=
выше будет стиль кнопки, эквивалентной настройке android:theme="android:
Theme.Holo
"
в манифесте будет делать с этой кнопкой, если бы это была деятельность.
Использование setVisibility
скрывать макеты с собственными стилями в фоновом режиме. Как это:
public static void changeWidgetState(RemoteViews remoteView, int state){
switch (state){
case 0:{
remoteView.setViewVisibility(R.id.widgetLayout1, View.VISIBLE);
remoteView.setViewVisibility(R.id.widgetLayout2, View.GONE);
} break;
case 1:{
remoteView.setViewVisibility(R.id.widgetLayout1, View.GONE);
remoteView.setViewVisibility(R.id.widgetLayout2, View.VISIBLE);
} break;
...
default:
}
}
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widgetLayout0"
android:layout_width="150dip"
android:layout_height="wrap_content"
>
<!--Normal Theme Black Text -->
<RelativeLayout
android:id="@+id/widgetLayout1"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
style="@style/WidgetBackgroundNormal"
/>
<!--Yellow Theme Black Text -->
<RelativeLayout
android:id="@+id/widgetLayout2"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
style="@style/WidgetBackgroundYellow"
/>
...
<LinearLayout
android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:paddingTop="7dip"
>
<TextView
android:id="@+id/widget_server_name"
style="@style/Text.DefinitionWhite"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="left"
android:layout_marginLeft="10dip"
/>
....
</LinearLayout>
</RelativeLayout>
Использование ContextThemeWrapper должно сработать http://developer.android.com/reference/android/view/ContextThemeWrapper.html