5

所以我在我的应用中有一个活动,目前标记为

android:launchMode="singleTop"

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

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

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

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

4

3 回答 3

1

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

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

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

于 2012-03-12T23:45:31.970 回答
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);
}

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

于 2012-03-13T00:46:09.333 回答
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();
    }
}
于 2012-09-19T17:10:43.517 回答