применение темы к appwidget - PullRequest
7 голосов
/ 23 октября 2010

Я пытаюсь определить тему для 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 ]

6 голосов
/ 21 декабря 2010

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

1 голос
/ 14 июля 2017

Используйте 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" />

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, который будет отображаться выше, будет соответствовать кнопке, эквивалентной настройке android:theme="android:Theme.Holo" в манифесте для этой кнопки.

1 голос
/ 24 мая 2012

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

Предположим, у нас есть два разных макета:

  • layout1.xml
  • layout2.xml

Мы устанавливаем наш макет следующим образом:

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout1);

А когда нам нужно, мы переключаем его на второй:

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout2);

Это решение отлично работает для меня.

0 голосов
/ 27 мая 2013

Использование ContextThemeWrapper должно сработать http://developer.android.com/reference/android/view/ContextThemeWrapper.html

0 голосов
/ 16 февраля 2011

Используйте 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>
...