在运行时以编程方式选择风格/主题

4

我有设备A和设备B。

我可以轻易地检测应用程序是在设备A还是在设备B上运行。 现在我需要在设备A上使用一个主题(样式),在设备B上使用另一个主题(样式)。

我该如何做到这一点?

1个回答

8
在Activity.onCreate()中,您可以调用setTheme()来设置所需使用的主题。请注意,这必须在调用setContentView()或创建UI之前完成。
请记住,当用户启动您的应用程序时,系统会显示其预览。该预览基于创建一个与您在清单中声明的主题相匹配的窗口。您希望此主题尽可能与您在onCreate()中设置的主题匹配,以使过渡到您的应用程序尽可能平滑。
如果您希望根据某些设备配置(例如平台版本或屏幕大小)改变主题,则可以通过资源实现所有这些。只需为您想要的不同配置声明不同版本的主题即可。文件布局应类似于:
values/
    styles.xml   # Required default theme
values-v11/
    styles.xml   # Theme when running on Android 3.0 or higher
values-xlarge/
    styles.xml   # Theme when running on an xlarge screen

-v11允许您在较新的平台上运行时使用新主题的版本,同时在旧版本上回归到兼容的内容。例如,在values-v11样式中,您的主题父级可以是新的@android:style/Theme.Holo,而基本样式将继承自旧的@android:style/Theme。

此外,Android 3.0还提供了一种在运行时更改主题的方法,通过要求重新启动活动,就像发生配置更改时一样:http://developer.android.com/reference/android/app/Activity.html#recreate()

调用该方法后,创建的Activity的新实例可以使用不同的setTheme()值(例如,基于保存的实例状态或共享首选项中的信息),而不是先前使用的主题。


如果有浅色和深色主题可用,您如何设置预览屏幕大致匹配主题?例如,如果您有一个使用黑色作为windowBackground的主题,另一个使用白色 - 是否有一种动态样式预览屏幕的方法? - Tim Malseed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接