我以编程方式切换活动主题时遇到问题。我有一个路由器活动,该活动根据某些条件决定要路由的活动。路由器活动可以在两个时间打开:具有启动屏幕主题的应用程序启动时间,以及从某处调用startActivity以使用NoDisplay或Transparent主题做出路由器决定。我已经在清单中设置了启动主题,并且效果很好。但是在调用startactivity时,我无法在运行时更改为透明主题。它显示黑色背景颜色,而不是透明。
RouterActivity:
override fun onCreate(savedInstanceState: Bundle?) {
val transparent = intent.extras?.getBoolean("Need_Transparent")?:false
if(transparent) setTheme(R.style.Theme_Transparent)
super.onCreate(savedInstanceState)
//no setContentView()
}
styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="Theme.Transparent" parent="android:Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
<style name="Theme.Splash" parent="android:Theme">
<item name="android:windowBackground">@android:color/holo_green_light</item>
</style>
AndroidManifest.xml:
<activity
android:name=".RouterActivity"
android:theme="@style/Theme.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
因此,如何使RouterActivity具有两个主题:Splash(清单中的默认值)和Transparent主题(通过其他活动的startActivity打开)。
我正在用Java提供此解决方案,希望相同的逻辑也可以在Kotlin中工作,
设置主题的最佳方法是将Resrouces.Theme放在类中,并使用OnCreate方法中存在的相同逻辑
@Override
public Resources.Theme getTheme() {
Resources.Theme theme = super.getTheme();
if(useAlternativeTheme){
theme.applyStyle(R.style.AlternativeTheme, true);
}
// you could also use a switch if you have many themes that could apply
return theme;
}