更改 singleTop Activity 的主题

5
所以我在我的应用程序中有一个活动,目前被标记为
android:launchMode="singleTop"

我目前在onCreateonNewIntent中都有逻辑,以确保屏幕始终显示由最新Intent启动的数据。我想根据该Intent提供的数据在Holo.Light和Holo.Dark之间切换。

调用setTheme不起作用(请参见这两个链接):

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

我已经没有更多的想法了。 除了为此活动制作自定义ActionBar视图之外,还有其他方法吗?

3个回答

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);
}

我基本上只是完成活动并再次调用它。我禁用任何转换动画,以使重新加载看起来瞬间完成。


1
对于其他尝试此操作的人,我必须更改该方法的第3行为intent.setFlags。所涉及的意图设置了Intent.FLAG_ACTIVITY_REORDER_TO_FRONT标志,这导致重新启动失败。 - Eric

1

由于您提到了Holo主题,我假设您正在使用API 11+。

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

Google Books应用程序使用此策略在“夜间模式”下切换浅色/深色主题。


对不起,actionbarsherlock标签应该表明我需要它在不仅仅是最新的设备上工作。 - Eric
1
是的,但您仍然可以使用完成并启动新活动的方法,并在支持它的设备上使用此方法来支持旧的操作系统版本(假设这样做更好,因为它是API的一部分)。 - Mario Lenci

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();
    }
}

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