在app启动期间更改主题的最快方法

时间:2014-02-20 16:55:49

标签: android

目前,我在我的应用程序中提供2个主题,基于用户的最后选择 - 黑暗主题和浅色主题。

在主要活动开始期间,我将执行以下操作。

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. 一会儿......
  4. 由于主this.setTheme
  5. 中的Activity,应用会更改为白色主题

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

    p / s注意,如果从清单中删除主题信息,它将没有多大帮助。由于系统默认使用holo dark。您仍然会观察到过渡,尤其是在慢速设备中。

2 个答案:

答案 0 :(得分:1)

隐藏主题操作,特别是在app启动时很棘手。不幸的是,没有办法一致地删除那个初始转换,因为没有人知道运行它的设备有多快/慢。在为主要活动的布局膨胀之前,Android将始终在默认主题中显示空白背景。

但隐藏它有一个技巧。用户打开应用时显示的启动画面,并在加载初始活动后淡出。这样,启动屏幕隐藏了主题转换,而不会刺激用户。飞溅屏幕得到了一些当之无愧的仇恨,但这样的情况确实证明了它们的使用。同样,我不知道你的应用程序的具体细节,但你必须权衡拥有启动画面和平滑过渡的优缺点,而不是没有启动画面和不和谐的过渡。

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

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" />

答案 1 :(得分:1)

我知道这很老了,但也许它仍然有帮助:

如果您将活动的主题设置为

android:theme="@android:style/Theme.Translucent.NoTitleBar"

它不会显示初始屏幕。相反,它只需要花一点时间让应用程序显示任何内容。