以编程方式具有两个主题的一个活动

问题描述 投票:0回答:1

我以编程方式切换活动主题时遇到问题。我有一个路由器活动,该活动根据某些条件决定要路由的活动。路由器活动可以在两个时间打开:具有启动屏幕主题的应用程序启动时间,以及从某处调用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打开)。

android android-activity styles themes
1个回答
0
投票

我正在用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.