主题的使用

默认创建的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 Activity );// 模拟系统初始化
        setContentView(R.layout.activity_main);
        // 启动后停留一段时间后自动进入到主页面
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish();
            }
        }, 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>

主题 Theme 小结的更多相关文章

  1. 总结一下Android中主题(Theme)的正确玩法

    在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme">,其中的@style/AppT ...

  2. Struts2的模板和主题theme及自定义theme的使用

    Struts2的模板和主题theme及自定义theme 标签: struts2 2016-03-29 11:22 190人阅读 评论(0) 收藏 举报  分类: javaweb(8)  Struts2 ...

  3. 第十四章:样式(Style)和主题(Theme)

    简介 Android的样式(Style)和主题(Theme)文件就好比WEB开发中的CSS一样,可以实现UI界面的风格统一管理,这和Windows平台的XAML格式(Silverlight.WPF)类 ...

  4. 【转载】总结一下Android中主题(Theme)的正确玩法

    http://www.cnblogs.com/zhouyou96/p/5323138.html 总结一下Android中主题(Theme)的正确玩法 在AndroidManifest.xml文件中有& ...

  5. Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

    原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...

  6. Android 主题theme说明 摘记

    主题Theme就是用来设置界面UI风格,可以设置整个应用或者某个活动Activity的界面风格.在Android SDK中内置了下面的Theme,可以按标题栏Title Bar和状态栏Status B ...

  7. Android下Notification,样式style,主题theme的功能实现

    一:Notification 1.NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVIC ...

  8. struts2官方 中文教程 系列十四:主题Theme

    介绍 当您使用一个Struts 2标签时,例如 <s:select ..../>  在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...

  9. eclipse 切换主题Theme

    eclipse切换主题theme 1. 打开help -> eclipse marketplace,搜索theme 2. 点击右侧安装后一直继续,直到安装完成 3. 安装完成后会重启eclips ...

随机推荐

  1. LoadRunner中Vugen-Recording Options选项卡介绍:

    LoadRunner中Vugen-Recording Options选项卡介绍:

  2. LoadRunner中参数的设置

    LoadRunner中参数的设置 参数个数:10个 tester1.tester2.tester3…tester10 迭代次数:2次 场景设置(一):Sequential+Each Iteration ...

  3. cordova 使用WKWebView 适配iphoneX及解决不能拨打电话问题

    先安装插件 cordova-plugin-wkwebview-engine 然后修改插件中CDVWKWebViewEngine.m文件,下面是全部代码,修改部分已经进行注释     /* Licens ...

  4. 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]

    洛谷传送门,BZOJ传送门 秘密消息Secret Message Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共有M(1≤M≤5 ...

  5. 关于 Unity 版本升级后可能会引起偶发光照图错乱的问题

    近期项目遇到一个奇怪的问题,使用 Unity 2017 版本升级后,团队中某些人的机器光照图总是不正确,而有的人是正确的,一直不知道为什么. 为了查到这个奇怪问题的原因,首先查看了美术的在 Max 中 ...

  6. hdu 1596 find the safest road (dijkstra)

    Problem Description XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条 ...

  7. noip历届 && 打代码常犯错误总结

    最近(21号~24号)A了下noip历届……(挑题做的,主要做最近几年的) 发现noip好像十分钟情于搜索枚举……好几届都有. 发现自己搜索基本功实在堪忧啊,首先算法设计的十分拙计,而且还不会剪枝,然 ...

  8. POJ3687 Katu Puzzle

    好好写2-sat 如果a1-->b1矛盾则连边a1-->b2和b1-->a2 我定了一个ccnt和cnt变量,结果少打一个c,wa了好多次(lll¬ω¬) By:大奕哥 #inclu ...

  9. [COGS2426][HZOI 2016]几何

    [COGS2426][HZOI 2016]几何 题目大意: 给定平面坐标系内\(n\)个整点,求这些整点能构成的正多边形的边数的最大值. 思路: 一个基本结论:平面直角坐标系内能够形成的正多边形一定是 ...

  10. Java编程思想学习(五)----第5章:初始化与清理

    随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...