我正在尝试为appwidget定义一个主题,并将其应用于 应用程序级别。我有一个像
这样的主题<style name="theme.dark">
<item name="android"background">#000000</item>
</style>
在我的清单中,我在应用程序中设置了android:theme="@style/theme.dark"
。但是,当我运行appwidget时,它不会从样式中获取项目。我尝试在我的视图布局中的单个元素上设置style="@style/theme.dark"
,这确实有用......但这不是我想要的。我不想为我视图中的每个元素调出特定的style =“...”。这个页面,
http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html
有一个很好的示例应用程序使用主题/样式,它的工作完美。唯一的区别是它是一个应用程序..它是在活动而不是应用程序上设置主题。
我还尝试在访问视图之前使用appwidget的onHandleUpdate()中的setTheme(...)以编程方式在Context对象上设置主题。这也不起作用。
任何想法? 感谢。
答案 0 :(得分:6)
答案是您无法动态地将主题应用于appwidget。除了提供每个静态引用特定主题的多个布局,然后在构建远程视图时选择正确的主题/布局,没有其他解决方案。
答案 1 :(得分:1)
由于我们不能动态地将主题用于appwidget,我建议下一个简单的解决方案 - 只需在布局文件之间切换:
假设我们有两种不同的布局:
我们将布局设置如下:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout1);
当我们需要时,我们将其切换到第二个:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout2);
这个解决方案对我来说很好。
答案 2 :(得分:1)
在相关布局中使用style="@android:style/
Widget.(THEME).(CONTROLTYPE)
"
,例如按钮上的 Holo :
<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
"
设置对该按钮的设置,这是一项活动。
答案 3 :(得分: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>
答案 4 :(得分:-3)
使用ContextThemeWrapper应该执行技巧http://developer.android.com/reference/android/view/ContextThemeWrapper.html