所以我的应用程序中有一个活动,当前标记为
android:launchMode="singleTop"
...我目前在onCreate和onNewIntent中都有逻辑,以确保屏幕始终显示由启动的最新Intent提供的数据 . 而且我希望能够根据Intent提供的数据在Holo.Light和Holo.Dark之间进行切换 .
调用setTheme不起作用(请参阅以下两个链接):
第二个链接有一个解决方法,涉及创建第二个AndroidManifest.xml条目,该条目具有另一个主题并指向相关活动的空子类 . 这有效,但它会破坏singleTop(因为现在堆栈上有两个活动实例) .
我没有想法 . 有人知道除了为这个活动滚动我自己的自定义ActionBar视图之外还有什么方法可以做到这一点吗?
3 回答
您需要使用setTheme()方法设置主题,然后重新加载活动 .
我有一个singleTask活动,以及一个在API <11上运行的代码,所以我有这个代码来重新加载活动:
我刚刚完成活动并再次调用它 . 我禁用任何过渡动画,使重新加载看起来是即时的 .
由于您指的是Holo主题,我假设您正在使用API 11 .
API 11添加了方法Activity#recreate(),它通过相同的拆除/重新创建过程发送您当前的活动,该过程通常用于配置更改,例如在横向和纵向之间旋转屏幕 . 您的onCreate方法将在新的Activity实例上再次调用,允许您像往常一样在窗口初始化之前在Activity上设置主题 .
Google图书应用程序使用此策略在“夜间模式”的明暗主题之间切换 .
我将发布我的解决方案,这里并没有真正添加任何新内容,而是将各种提示合并在一起 .
更改活动的主题后,可选择(取决于您要查找的内容)应用程序:
然后,您必须重新创建活动(就像配置更改后一样) . 对于OS 11>有一个API,而不是以前的版本,你必须强制它完成并重新启动活动,就像Udinic指出的那样 .