所以我的应用程序中有一个活动,当前标记为
android:launchMode="singleTop"
...我目前在 onCreate 和 onNewIntent 中都有逻辑,以确保屏幕始终显示由启动的最新Intent传送的数据。而且我希望能够根据Intent提供的数据在Holo.Light和Holo.Dark之间进行切换。
调用setTheme不起作用(请参阅以下两个链接):
第二个链接有一个解决方法,涉及创建第二个 AndroidManifest.xml 条目,该条目具有另一个主题并指向相关活动的空子类。这有效,但它会破坏 singleTop (因为现在堆栈上有两个活动实例)。
我没有想法。除了为此活动滚动我自己的自定义ActionBar视图外,是否有人知道是否有任何方法可以做到这一点?
答案 0 :(得分:1)
由于您指的是Holo主题,我假设您正在使用API 11 +。
API 11添加了方法Activity#recreate()
,该方法通过相同的拆卸/重新创建过程发送您当前的活动,该过程通常用于配置更改,例如在横向和纵向之间旋转屏幕。您的onCreate方法将在新的Activity实例上再次调用,允许您在常规窗口初始化之前在Activity上设置主题。
Google图书应用程序使用此策略在“夜间模式”的明暗主题之间切换。
答案 1 :(得分: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);
}
我刚刚完成活动并再次调用它。我禁用任何过渡动画以使重新加载看起来是即时的。
答案 2 :(得分: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();
}
}