首页 文章

更改singleTop活动的主题

提问于
浏览
5

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

android:launchMode="singleTop"

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

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

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

我没有想法 . 有人知道除了为这个活动滚动我自己的自定义ActionBar视图之外还有什么方法可以做到这一点吗?

3 回答

  • 0

    您需要使用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

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

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

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

  • 1

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

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

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

相关问题