morristech
2/20/2019 - 6:44 AM

Example of how to change themes at runtime with a smooth animation. In this example, we just switch between a light and a dark theme. The ac

Example of how to change themes at runtime with a smooth animation. In this example, we just switch between a light and a dark theme. The activity animation is defined in the theme and as such will be default on all activities with the set theme. Demo Video here.

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;


public class TransitionThemeActivity extends AppCompatActivity implements View.OnClickListener {

  ListView mListView;
  Button mChangeTheme;

  @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);

    mListView = (ListView) findViewById(R.id.cheese_list);
    mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, Cheeses.CHEESES));

    mChangeTheme = (Button) findViewById(R.id.change_theme);
    mChangeTheme.setOnClickListener(this);

  }

  @Override
  public void onClick(View v) {
    AppSettings settings = AppSettings.getInstance(this);
    settings.set(AppSettings.Key.USE_DARK_THEME,
        !settings.getBoolean(AppSettings.Key.USE_DARK_THEME));
    Intent intent = new Intent(this, TransitionThemeActivity.class);
    startActivity(intent);
    finish();

  }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.alimuzaffar.android.scratchpad" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppThemeLight" >
        <activity
            android:name=".TransitionThemeActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>
<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>
</resources>