android - 在应用程序启动期间更改主题的最快方法

标签 android

目前,我确实根据用户最后的选择在我的应用中提供了 2 个主题 - 深色主题和浅色主题。

在主要 Activity 启动期间,我将执行以下操作。

public class MyFragmentActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // getUserLastThemeChoice will either return R.style.Theme_My_Light or 
        // R.style.Theme_My_Dark.
        this.setTheme(getUserLastThemeChoice());

        super.onCreate(savedInstanceState);

在我的 AndroidManifest.xml 中,我有以下内容

<application
    ...
    android:theme="@style/Theme.My.Dark" >

由于AndroidManifest.xml中的硬编码值,如果用户之前选择的是浅色主题,我会观察以下内容。

  1. 应用以深色主题启动,由于 AndroidManifest.xml
  2. 一会儿...
  3. 由于主 Activity 中的 this.setTheme,应用将更改为白色主题

有什么办法可以避免这种过渡观察?就是这样,根据他们最后的选择直接呈现给用户。

p/s 请注意,如果您从 list 中删除主题信息,那将无济于事。由于系统将默认使用 holo dark。您仍会观察到过渡,尤其是在慢速设备中。

最佳答案

隐藏主题操作,特别是在应用程序启动时是很棘手的。不幸的是,没有办法始终如一地删除初始转换,因为不知道运行它的设备有多快/多慢。在为主要 Activity 扩充布局之前,Android 将始终在默认主题中显示空白背景。

但是有一个技巧可以隐藏它。用户打开应用程序时出现的启动画面,并在初始 Activity 加载后淡出。通过这种方式,初始屏幕隐藏了主题转换,而不会影响用户。启动画面受到一些当之无愧的仇恨,但像这样的情况确实证明了它们的使用。同样,我不知道您的应用的具体细节,但您必须权衡具有启动画面和平滑过渡与没有启动画面和不和谐过渡的利弊。

实现启动画面的方法有很多种。在您的情况下,我会尝试创建一个具有中性主题的启动器 Activity ,并为启动画面和您的主要 Activity 之间的过渡应用平滑的动画,如下所示:

startActivity( new Intent( LauncherActivity.this, MainActivity.class ) );
overridePendingTransition( R.anim.fade_in, R.anim.fade_out );

还有动画:

<!-- fadeout -->
<?xml version="1.0" encoding="UTF-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="300" />

<!-- fadein -->
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="300" />

关于android - 在应用程序启动期间更改主题的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21914482/

相关文章:

带有背景的android波纹按钮

java - 以编程方式向 ShapeDrawable 添加阴影

android - 设备是否需要 root 才能在 Android 设备上读取 '/proc/cpuinfo'?

android - startActivityForResult 在恢复短信时总是返回 0

java - 默认FirebaseApp在此过程中未初始化official96.yohan.lms。确保首先调用 FirebaseApp.initializeApp(Context)

android - MediaPlayer 创建方法不适用于 galaxy s3

android - picasso 没有加载图像

android - 饼图 : how to display text just on some pie slices using AChartEngine Android library?

java - 错误 :Timeout waiting to lock buildscript class cache for build file when change minSdkVersion

android - 使用 Bazel 和 j2objc 在 iOS 和 Android 之间共享代码