Android - 如何在运行时切换主题

时间:2013-10-16 17:02:49

标签: android

有人可以告诉我如何在运行时在我的应用程序中将主题从holo切换到holo light? 我想在设置中有两个按钮来选择浅色或黑色主题。 如何在整个应用范围内设置,而不仅仅是针对活动?

我已经用setTheme()尝试了一些东西但是当我点击一个按钮时我无法改变主题。

这是我的设置活动,我想设置主题:

public class SettingsActivity extends Activity  {

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {


setTheme(android.R.style.Theme_Holo_Light);

super.onCreate(savedInstanceState);

setContentView(R.layout.settings);

}

这很有效,我的主题已设置,但正如我所说,我想通过按下按钮在系统范围内更改它。

谢谢!

2 个答案:

答案 0 :(得分:3)

您无法更改其他应用程序的主题(谢天谢地)。

实现此目的的唯一方法是使用您自己的主题作为设备默认主题创建自己的操作系统版本。但是,不使用设备默认主题的应用程序(即他们明确将主题设置为Holo,Holo light等)将无法获得设备默认主题。

编辑 - 要使用基本活动在应用程序范围内完成此操作,请创建一个如下所示的活动:

public class BaseActivity extends Activity {
    private static final int DEFAULT_THEME_ID = R.id.my_default_theme;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        int themeId = PreferenceManager.getDefaultSharedPreferences(context)
                .getInt("themeId", DEFAULT_THEME_ID);
        setTheme(themeId);

        super.onCreate(savedInstanceState);
    }
}

然后,您的所有活动都应扩展此BaseActivity。如果要更改主题,请务必将其保存到SharedPreferences。

答案 1 :(得分:3)

正如您所见,主题是onCreate()setContentView()之前的设置。因此,当您想要更改主题时,应该再次调用oncreate()方法。但onCreate()函数将仅在活动的生命周期中调用一次。

有一种简单的方法可以做到这一点。我不确定这是最好的方式。

假设您想在按钮点击时将新主题应用于 活动1

在onClick事件中

  1. 保存要应用的主题,即使在应用程序重新启动后也应该保留它(可以使用首选项或静态易失性变量)。
  2. 完成当前活动( 活动1 )并调用新活动( 活动2 )。< / LI>

    现在位于 活动2

    1. 致电 活动1 并完成当前活动( 活动2 )。
    2. 活动1

      1. 将保存的主题应用于onCreate
      2. 希望它不会令人困惑.. :)