以编程方式更改启动活动样式

时间:2019-07-04 10:02:10

标签: java android themes

我有一个活动(MainActivity.java),它在加载主要片段且其他功能在后台进行时用作启动屏幕。此启动屏幕始终显示棕色图块背景和图标。我要显示的是仅在变量dayMode为false(在Constants.java中为变量)时显示背景(在R.style.AppTheme_NoActionBar_LauncherNight中)。否则,背景应为R.style.AppTheme_NoActionBar_LauncherDay中的背景(白色背景和相同的图标)。

如果我在清单的android:theme部分中指定一个或另一个背景,则显示效果很好。但是我想要的是根据dayMode的值,在活动的onCreate方法上以编程方式设置一个主题或另一个主题。这是行不通的。

我在调用super.onCreate或setContentView之前尝试使用setTheme,正如我在其他答案中所读到的那样,但是它不起作用。我只能找到解释您应调用setTheme和setContentView的顺序的答案,但它们不能解决此问题。

我的风格:

 <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="autoCompleteTextViewStyle">@style/cursorColor</item>
        <item name="android:textColorSecondary">@color/yellow_light</item>
 </style>

 <style name="AppTheme.NoActionBar.LauncherNight">
        <item name="android:windowBackground">@drawable/launch_screen</item>
 </style>

 <style name="AppTheme.NoActionBar.LauncherDay">
        <item name="android:windowBackground">@drawable/launch_screen_day</item>
 </style>

我的清单:

    <activity
            android:name="com.AlbaRam.myApp.MainActivity"
            android:configChanges="keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar.LauncherNight"
            android:launchMode="singleInstance"
            android:windowSoftInputMode="stateAlwaysHidden">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

我的ActivityMain:

@Override
    protected void
    onCreate(Bundle savedInstanceState) {
        //This is not working
        if (Constants.dayMode){
            super.setTheme(R.style.AppTheme_NoActionBar_LauncherDay);
        } else {
            setTheme(R.style.AppTheme_NoActionBar_LauncherNight);
        }

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //rest of functionality

    }

3 个答案:

答案 0 :(得分:1)

尝试使用此代码

theme.xml

<resources>
<style name="AppThemeLight" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>
<style name="AppThemeDark" parent="Theme.AppCompat">
    <!-- Customize your theme here. -->
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>
<!-- This will set the fade in animation on all your activities by default -->
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>

活动

  @Override
      protected void onCreate(Bundle savedInstanceState) {
        AppSettings settings = AppSettings.getInstance(this);
        setTheme(settings.getBoolean(AppSettings.Key.USE_DARK_THEME) ? R.style.AppThemeDark : R.style.AppThemeLight);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition_theme);

        //

        }

答案 1 :(得分:1)

public void onCreate(Bundle savedInstanceState) {

 if (Constants.dayMode){

           setTheme(android.R.style.yourTheme);

        } else {

           setTheme(android.R.style.yourTheme);

        }
    super.onCreate(savedInstanceState);

    setContentView(R.layout.actvity);
}

答案 2 :(得分:0)

经过一些研究,我发现这是不可能的。当我们要在加载主要功能时显示某些东西时,会使用启动屏幕,因此我们将要显示在清单中的可绘制对象包括在内,以使它在加载主要活动时快速显示。清单中的启动屏幕会出现在其他所有内容之前,因此,如果我们可以动态更改启动屏幕的主题,那么在加载其他所有内容时,我们将失去快速显示的功能。