2010-10-23 4 views
5

Я пытаюсь определить тему для 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() приложения, перед доступом к представлению. это тоже не работает.

любые идеи? спасибо.

ответ

5

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

0

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

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

+0

О, как бы вы это сделали, можете ли вы привести пример? –

1

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

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

  • layout1.xml
  • layout2.xml

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

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

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

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

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

+1

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

+0

Вы абсолютно правы в отношении ситуации, в которой у нас будут темы разного размера. Я считаю, что для этого есть несколько твиков :) – Jviaches

-3

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

+0

Почему это было downvoted? – JosephMCasey

+0

'ContextThemeWrapper' или любой' Context' фактически не имеет отношения к 'RemoteView', потому что' RemoteView 'сериализуются и отправляются в другие приложения, такие как пусковые установки. Такие приложения затем рисуют их, используя их 'Context's – tasomaniac

0

Использовать обычные 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" в манифесте бы к этой кнопке, эта деятельность была.

Смежные вопросы