以编程方式切换应用程序范围主题?

时间:2011-01-11 23:13:52

标签: android themes android-theme

我试图获得一个用户选择的主题,感觉我很沮丧。在AndroidManifest.xml中定义主题可以正常工作,但是(尽我所知)不能根据应用偏好进行更改:

<application 
    android:theme="@style/theme_sunshine" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name">

或者,在每个活动中动态设置它也可以:

someChosenTheme = PreferenceManager.getDefaultSharedPreferences(this).getString("themePreference", "theme_twilight");
setTheme(someOtherChosenTheme);

但这看起来很混乱,我宁愿在一个地方设置整个应用程序的主题。我的第一个想法是在我的主要活动启动后立即抓住应用程序上下文并在那里执行:

getApplicationContext().setTheme(R.style.theme_dummy);

我可以说,this应该做的伎俩,但实际上它没有做任何事情 - 整个应用程序都有默认的Android风格。以上是否有效,如果是的话,我可能会做一些其他的愚蠢行为吗?

如果重要的话,我在API级别3工作。正确方向的产品非常感谢!

Related question.

2 个答案:

答案 0 :(得分:31)

为您的应用创建基本活动并覆盖onCreate以设置主题。从此基本活动中派生所有其他活动。

另请查看本教程: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

答案 1 :(得分:5)

可能有一个很好的解决方案,但我找不到一个,所以我最终在一个辅助类中创建一个小的静态辅助方法,它接受一个Activity并基本上执行你编写的那两行。当然,它并不完美,但只需在我的应用程序中为每个onCreate()方法添加一行简短的代码即可。