2012-03-12 53 views
4

所以,我有我的应用程序,当前标记为更改singleTop活动的主题

android:launchMode="singleTop" 

的活动......我现在有两个的onCreate onNewIntent逻辑确保屏幕始终显示由启动的最新Intent提供的数据。我希望能够根据该Intent提供的数据在Holo.Light和Holo.Dark之间进行更改。

调用setTheme不工作(见这两个环节):

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

我出来的想法。任何人都知道是否有任何方法可以执行此操作,而不必为此活动滚动自己的自定义ActionBar视图?

回答

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

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

+0

这样的声音应该可以工作。谢谢! – Eric 2012-03-13 03:33:53

+1

对于其他任何正在尝试此操作的人,我必须将方法的第3行更改为intent.setFlags。有问题的意图设置了Intent.FLAG_ACTIVITY_REORDER_TO_FRONT标志,导致重启失败。 – Eric 2012-03-13 20:21:29

1

既然你指的是全息主题,我假设你正在使用API​​ 11+。

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

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

+0

对不起,actionbarsherlock标记应该表明我需要这个工作不仅仅是最新的和最好的。 – Eric 2012-03-13 03:33:23

+1

是的,但您仍然可以使用完成并启动新活动的方法来支持较旧的操作系统版本,并在支持它的设备上使用这一项(假设更好的原因是API的一部分)。 – 2012-09-19 16:59:07

0

我会发布我的解决方案,并不真正添加新东西,但将各种提示合并在一起。

变更活动的主题和可选后(取决于你在找什么)申请:

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

然后,您必须重新创建活动(就如同配置更改后)。 对于操作系统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(); 
    } 
}