主题的使用
默认创建的Android工程中,在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme">,其中的@style/AppTheme是引用的 res/values/styles.xml 或者 res/values-v21/styles.xml 中的主题样式,这是根据运行此程序的手机系统来决定的,如果手机系统的API版本是21以上就是v21/styles.xml,以此类推。在values/styles.xml中你会发现,AppTheme的主题样式又是继承自AppBaseTheme,而AppBaseTheme的父主题就各有不同了,你可以从这个位置来自己修改主题。
主题的来源有三个:
- 1) 来自Android系统自带的,使用系统自带的主题要加上"android:"前缀,如:android:Theme.Black或@android:style/Theme.Black
- 2) 来自兼容包的(比如v7兼容包),使用兼容包中的主题不需要前缀,如:Theme.AppCompat或@style/Theme.AppCompat
- 3) 你自己写一个主题,不需要前缀
系统自带的主题
系统默认大的主题是三种:Theme,Theme.Holo,Theme.DeviceDefault, 但是实际上在此基础系统还定义了大量的派生主题,最典型的是对应的Light主题。
除此之外,还有很多
所有能作为应用程序主题的项目的名字都是以"Theme."开头的,不是以"Theme."开头的就不是应用程序主题,而是用于某些局部控件。
比如"ThemeOverlay"主题可用于 Toolbar 控件,"TextAppearance"主题可用于设置文字外观。
在v7中有很多以"Base"开头的主题,是一些父主题,不建议直接使用。
API 1:
- android:Theme 根主题
- android:Theme.Black 背景黑色
- android:Theme.Light 背景白色
- android:Theme.Wallpaper 用系统桌面做为应用程序背景
- android:Theme.Translucent 透明背景
- android:Theme.Panel 平板风格
- android:Theme.Dialog 对话框风格
API 11:
- android:Theme.Holo Holo根主题
- android:Theme.Holo.Black Holo黑主题
- android:Theme.Holo.Light Holo白主题
API 14(继承自Holo主题):
- Theme.DeviceDefault 设备默认根主题
- Theme.DeviceDefault.Black 设备默认黑主题
- Theme.DeviceDefault.Light 设备默认白主题
API 21(Material Design风格主题):
- Theme.Material Material根主题
- Theme.Material.Light Material白主题
兼容包中的主题
兼容主题意思就是,说如果运行程序的手机API是21则就相当于是Material主题,如果运行程序的手机API是11则就相当于是Holo主题,以此类推。
兼容包v7会被Google不断升级,比如 appcompat-v7-21.0 表示升级到向 API 21 兼容,appcompat-v7-23.2 表示升级到向 API 23 兼容。
兼容包v7中带的兼容主题有:
- Theme.AppCompat 兼容主题的根主题
- Theme.AppCompat.Black 兼容主题的黑色主题
- Theme.AppCompat.Light 兼容主题的白色主题
在AS项目的 External Libraries 中可以查看v7包的版本号
而在eclipse中只能看到 appcompat_v7,后面没有跟API的版本号,那么如何识别呢?
可以在展开appcompat_v7库中的res文件夹,查看有没有values-21、values-23这样的文件夹,最大数字就是API版本号了。
所以同样是v7兼容包,会有API版本号不同的区别,要注意。
更多主题风格设置
以下都是指"
包含",比如包含"Dialog"表示对话框风格
比如Theme.Dialog、Theme.Holo.Dialog、Theme.Material.Dialog、Theme.AppCompat.Dialog都是对话框风格
具体有没有这种组合,你就在"
自动提示"中来看就可以,提示有就有,没有就没有。
- Black 黑色风格
- Light 白色风格
- Dark 黑暗风格
- DayNight 白昼风格
- Wallpaper 用系统桌面为应用程序背景
- Translucent 透明背景
- Panel 平板风格
- Dialog 对话框风格
- NoTitleBar 没有标题栏
- NoActionBar 没有ActionBar
- Fullscreen 全屏
- MinWidth 对话框或者ActionBar的宽度根据内容变化,而不是充满全屏
- WhenLarge 对话框充满全屏
- TranslucentDecor 半透明风格
- NoDisplay 不显示,也就是隐藏了
- WithActionBar 在旧版主题上显示ActionBar
很多主题在使用时会报错,原因有很多,比如窗体必须继承AppCompactActivity,或者要继承ActionBarActiivty,或者要继承FragmentActivity,或者需要手动指定宽高,或者需要提升最低API版本,或者需要更高版本的SDK,或者兼容包版本不对等原因。
解决应用启动时的黑屏、白屏问题
产生原因
其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景。
启动页Activity
public class SplashActivity extends{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//当你从桌面上点击一个应用到执行该应用起始Activity 的 onCreate() 函数是需要一定的时间的,尤其是在该应用从来没使用过的情况下,该时间会更长,这是启动时产生白屏、黑屏的原因
//其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景(Theme下的android:windowBackground属性),黑屏白屏就是window窗口背景
sleep(3000);// 模拟系统初始化
(R.layout.activity_main);
// 启动后停留一段时间后自动进入到主页面
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
(new Intent(SplashActivity.this, MainActivity.class));
();
}
}, 1000);
}
}
启动页布局
注意,在不同情况下可能需要使用合适的scaleType属性和背景色
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/logo" />
</LinearLayout>
自定义样式
<resources>
<style name="AppBaseTheme"parent="android:Theme.Light"></style>
<style name="AppTheme"parent="AppBaseTheme"></style>
<style name="AppSplashTheme"parent="android:Theme.Light.NoTitleBar.Fullscreen">
<item name="android:screenOrientation">portrait</item>
<item name="android:windowNoTitle">true</item>
</style>
<!-- 背景是透明的,也就是当应用初始化时显示的是桌面的背景,初始化需要多久,界面显示为桌面就多久。适合于初始化时间比较短的应用 -->
<style name="AppSplashTheme1"parent="AppSplashTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
<!-- 推荐。背景是全屏背景图,当程序启动时,首先显示的就是这张背景图,避免了出现黑屏。但只有初始化完毕后才会刷新界面控件,可能给用户一种不同步的感觉-->
<style name="AppSplashTheme2"parent="AppSplashTheme">
<item name="android:windowBackground">@drawable/logo</item>
</style>
<!-- 下面的和上面的方式类似,可以利用layer-list将多个图片按照顺序层叠起来 -->
<style name="AppSplashTheme3" parent="AppSplashTheme">
<item name="android:windowBackground">@drawable/start_window</item>
</style>
</resources>
自定义layer-list
<?xml version="1.0" encoding="utf-8"?>
<!-- opacity属性的作用是:防止在启动的时候出现背景的闪烁 -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque" >
<item android:drawable="@android:color/black"/>
<item>
<!-- 注意,由于这里的bitmap不能手动设置大小(没有scaleType属性),所以不能保证这里面的图片在不同分辨率下的显示效果 -->
<bitmap
android:gravity="center"
android:src="@drawable/logo" />
</item>
<!-- 右上角的图标元素 -->
<item>
<bitmap
android:gravity="top|right"
android:src="@drawable/ic_launcher" />
</item>
</layer-list>