Применение темы к 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

Другие вопросы по тегам