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

Posted

技术标签:

【中文标题】以编程方式切换应用程序范围的主题?【英文标题】:Switching application-wide theme programmatically? 【发布时间】:2011-06-07 12:25:43 【问题描述】:

我正在尝试获取用户选择的主题,并且感觉自己非常接近。在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.

【问题讨论】:

【参考方案1】:

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

还可以查看本教程:

http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

【讨论】:

这基本上就是我正在做的事情。它仍然不理想,因为没有多重继承,例如对于自定义 ListActivity,但不便之处很小。非常有用的教程,尽管我已经阅读过它:) 我确实在我做的每个应用程序中都有一个 BaseListActivity 和一个 Base(Generic)Activity 。 BaseListActivity 内置了对 CRUD(读取、添加、编辑、删除)的通用处理,因此创建一个新的列表活动非常容易,只需覆盖几个方法。当然,如果我添加一个 MapActivity 或 TabActivity,我也必须为它们创建一个 BaseXActivity。有时多继承会更好:) 所以在调用“setContentView”之前为每个活动添加setTheme真的是正确的解决方案吗?没有单一的系统范围的解决方案吗?另外,所有已经存在的活动会发生什么? 对于活动活动,只要主题发生变化,只需调用 recreate() 即可。闪烁很难看,但我们必须忍受它。 很棒的教程链接,可以帮助我回答我最近遇到的一个不相关的问题。 “像 ?actionBarSize 这样的属性在哪里定义以及它们是如何工作的”:)【参考方案2】:

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

【讨论】:

以上是关于以编程方式切换应用程序范围的主题?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置的主题。如何重新加载 Activity 以应用

以编程方式更改 Windows 10 UWP 应用程序中的主题

如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?

Jetpack Compose:如何以编程方式将主题从浅色模式更改为深色模式 onClick

以编程方式切换 MVC 视图控制器 - iOS

如何以编程方式快速切换到暗模式