目前,我在我的应用程序中提供了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,应用程序将更改为白色主题
在那里我可以避免这种过渡观察吗?就是这样,根据他们的最后选择直接呈现给用户.
p / s注意,如果从清单中删除主题信息,它将没有多大帮助.由于系统默认使用holo dark.您仍然会观察到过渡,特别是在慢速设备中.
解决方法
隐藏主题操作,特别是在应用程序启动时很棘手.不幸的是,没有办法一致地删除那个初始转换,因为没有人知道运行它的设备有多快/慢.在为主要活动的布局膨胀之前,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" />