更改singleTop活动的主题

时间:2012-03-12 23:34:22

标签: android android-actionbar actionbarsherlock

所以我的应用程序中有一个活动,当前标记为

android:launchMode="singleTop"

...我目前在 onCreate onNewIntent 中都有逻辑,以确保屏幕始终显示由启动的最新Intent传送的数据。而且我希望能够根据Intent提供的数据在Holo.Light和Holo.Dark之间进行切换。

调用setTheme不起作用(请参阅以下两个链接):

第二个链接有一个解决方法,涉及创建第二个 AndroidManifest.xml 条目,该条目具有另一个主题并指向相关活动的空子类。这有效,但它会破坏 singleTop (因为现在堆栈上有两个活动实例)。

我没有想法。除了为此活动滚动我自己的自定义ActionBar视图外,是否有人知道是否有任何方法可以做到这一点?

3 个答案:

答案 0 :(得分:1)

由于您指的是Holo主题,我假设您正在使用API​​ 11 +。

API 11添加了方法Activity#recreate(),该方法通过相同的拆卸/重新创建过程发送您当前的活动,该过程通常用于配置更改,例如在横向和纵向之间旋转屏幕。您的onCreate方法将在新的Activity实例上再次调用,允许您在常规窗口初始化之前在Activity上设置主题。

Google图书应用程序使用此策略在“夜间模式”的明暗主题之间切换。

答案 1 :(得分:1)

您需要使用setTheme()方法设置主题,然后重新加载活动。

我有一个singleTask活动,以及一个在API< 11上运行的代码,所以我有这个代码来重新加载活动:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();

    overridePendingTransition(0, 0);
    startActivity(intent);
}

我刚刚完成活动并再次调用它。我禁用任何过渡动画以使重新加载看起来是即时的。

答案 2 :(得分:0)

我会发布我的解决方案,这里并没有真正添加任何新内容,但将各种提示合并在一起。

更改活动主题后,可选择(取决于您要查找的内容)应用程序:

public void updateTheme( Activity a, int themeID ) {
    a.getApplication().setTheme( themeID );
    a.setTheme( themeID );
}

然后,您必须重新创建活动(就像配置更改后一样)。 对于OS 11>有一个API,相反,对于以前的版本,您必须强制它完成并重新启动活动,就像Udinic所指出的那样。

public boolean isBeforeHoneycomb() {
    return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB;
}

public void reload() {
    if( isBeforeHoneycomb() ) {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();

        overridePendingTransition(0, 0);
        startActivity(intent);
    }else{
        recreate();
    }
}