目前,我在我的应用程序中提供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
中的硬编码值,如果用户先前的选择是轻量级主题,我将观察以下内容。
AndroidManifest.xml
this.setTheme
Activity
,应用会更改为白色主题
醇>
有什么方法可以避免这种过渡观察?就是这样,根据他们的最后选择直接呈现给用户。
p / s注意,如果从清单中删除主题信息,它将没有多大帮助。由于系统默认使用holo dark。您仍然会观察到过渡,尤其是在慢速设备中。
答案 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"
它不会显示初始屏幕。相反,它只需要花一点时间让应用程序显示任何内容。