重拾Android之路之开发准备


引言

本篇内容就整理一下开发Android的琐事细节。

主要分为以下几个主题:

  • Android固定横屏、竖屏
  • 横竖屏切换的问题
  • AppTheme属性设置集合
  • Android Theme 主题总结

Android固定横屏、竖屏

要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:

android:screenOrientation="portrait"

属性取值landscape为固定横屏、portrait为固定竖屏。

上面的方式是通过修改AndroidManifest.xml的属性来修改每个activity的横竖屏设置。

下面来看看代码设置横竖屏:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

对于单个Activity禁用横竖屏切换是很简单的,但是实际项目中会有很多的Activity,如果每个都设置一下就太麻烦了。有没有一处设置全局有效的方法呢?答案是有的,只要对第二种方式稍微改造一下即可。我们可以写一个如下的BaseActivity类:

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;

public class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

让其它的Activity都继承这个BaseActivity类就能实现全局禁用横竖屏切换了。实际开发中常用这种方法,不仅仅是用来设置横竖屏,还有其它的公共功能也可以写在BaseActivity中。继承确实是个好东西。


横竖屏切换的问题

屏幕自动切换时,默认状态的应用程序,会重新调用onCreate,相当于重新启动了一次应用程序。

同时,layout可能因为横屏带来不能合理适配的问题。为了解决旋屏和键盘切换引起的程序重启问题,还需要增加一个属性:android:configChanges。

这个属性可以理解为一个监听器,它将拦截旋屏和键盘切换事件,阻止程序重启而变为回调onConfigurationChanged方法。这里常用的属性取值为:keyboardHidden|orientation

android:configChanges="screenSize|keyboardHidden|orientation"
android:screenOrientation="sensor"    //sensor:旋屏,可切换横竖屏

AppTheme属性设置集合

现在新建一个项目基本都会在 style.xml 设置基础的 AppTheme,但是系统的给提供的设置属性又比较多。

所以在此收集记录,以便之后查找方便。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

    <!--状态栏颜色,应用的主要暗色调,statusBarColor默认使用该颜色-->
    <item name="android:colorPrimaryDark">@color/material_animations_primary_dark</item>
    <!--状态栏颜色,默认使用colorPrimaryDark-->
    <item name="android:statusBarColor">@color/material_animations_primary_dark</item>
    
    <!--Appbar背景色,应用的主要色调,actionBar默认使用该颜色-->
    <item name="android:colorPrimary">@color/material_animations_primary</item>
    
    <!--页面背景色-->
    <item name="android:windowBackground">@color/light_grey</item>
    
    <!--底部导航栏颜色-->
    <item name="android:navigationBarColor">@color/navigationColor</item>
    
    <!--应用的主要文字颜色,actionBar的标题文字默认使用该颜色-->
    <item name="android:textColorPrimary">@android:color/black</item>
    
    <!--ToolBar上的Title颜色-->
    <item name="android:textColorPrimaryInverse">@color/text_light</item>
    
    <!--应用的前景色,ListView的分割线,switch滑动区默认使用该颜色-->
    <item name="android:colorForeground">@color/colorForeground</item>
    <!--应用的背景色,popMenu的背景默认使用该颜色-->
    <item name="android:colorBackground">@color/colorForeground</item>
    
    <!--各个控制控件的默认颜色-->
    <item name="android:colorControlNormal">@color/colorControlNormal</item>
    <!--一般控件的选种效果默认采用该颜色-->
    <item name="android:colorAccent">@color/colorAccent</item>
    <!--控件选中时的颜色,默认使用colorAccent-->
    <item name="android:colorControlActivated">@color/colorControlActivated</item>
  
    <!--控件按压时的色调-->
    <item name="android:colorControlHighlight">@color/colorControlHighlight</item>
  
    <!--Button,textView的文字颜色-->
    <item name="android:textColor">@color/text_dark</item>
    
    <!--RadioButton checkbox等控件的文字-->
    <item name="android:textColorPrimaryDisableOnly">@color/text_dark</item>
    
    <!--默认按钮的背景颜色-->
    <item name="android:colorButtonNormal">@color/text_dark</item>
    
    <!--对话框的背景是否变暗-->
    <item name="android:backgroundDimEnabled">true</item>  

    <!--Activity 的切换动画。其引用的 activityAnim 也是 style ,需要继承 parent="@android:style/Animation.Translucent"-->
    <item name="android:windowAnimationStyle">@style/activityAnim</item>

    <!--title 标题栏字体设置-->
    <item name="android:titleTextAppearance">@style/MaterialAnimations.TextAppearance.Title</item>


    <!--允许使用transitions(过渡动画)-->
    <item name="android:windowContentTransitions">true</item>
    <!--是否覆盖执行,其实可以理解成前后两个页面是同步执行还是顺序执行-->
    <item name="android:windowAllowEnterTransitionOverlap">false</item>
    <!--与上面相同。即上一个设置了退出动画,这个设置了进入动画,两者是否同时执行。-->
    <item name="android:windowAllowReturnTransitionOverlap">false</item>
</style>

Android Theme 主题总结

简介:主题决定了App的展示效果,我们可以为整个Application指定主题,也可以为Activity单独指定主题,甚至可以为各个控件如Button、TextView指定主题。下面对Android Theme的引用方式,版本分类进行列举,并对兼容包主题进行了归类、总结。期望达到对Theme有一个总体的清晰的认识。

一、Theme的来源分类

  1. 系统的主题
  2. 第三方库的主题
  3. 兼容包如support_v7.jar的主题
  4. 用户自定义的主题

二、引用方式

  • 系统主题: "@android:style/Theme.Holo.Light"
  • 兼容包: AndroidManifests.xml中"@style/Theme.Appcompat",其他地方使用“Theme.Appcompat”即可
  • 自定义主题:"@style/AppTheme"

三、Theme的版本分类

  1. android:Theme API 1 开始
  2. android:Theme.Holo API 11(android3.0) 开始
  3. android:Theme.DeviceDefault API 14(android4.0) 开始
  4. android:Theme.Material API 21(android5.0) 开始
  5. Theme.AppCompat 兼容包AppCompat_v7中的主题

主题的不同版本:

Theme:

  • Theme 深色主题
  • Theme.Light 浅色主题

位置:sdk/platforms/android-25/data/res/values/themes.xml
简介:许多主题的最终父类主题

Theme.Holo:

  • Theme.Holo 深色主题
  • Theme.Holo.Light 浅色主题

位置:sdk/platforms/android-25/data/res/values/themes_holo.xml
简介:android 11 - 13 的默认主题

Theme.DeviceDefault:

  • Theme.DeviceDefault 深色主题
  • Theme.DeviceDefault.Light 浅色主题

位置:sdk/platforms/android-25/data/res/values/themes_device_defaults.xml
简介:android 14以上的默认主题,在不同系统版本的设备上可以提供不同的样式

Theme.Material:

  • Theme.Material 深色主题
  • Theme.Material.Light 浅色主题

位置:sdk/platforms/android-25/data/res/values/themes_material.xml
简介:Material Design的样式

Theme.Leanback :

位置:sdk/platforms/android-25/data/res/values/themes_leanback.xml
简介:不知道是什么主题,暂且罗列在此

AppCompat_v7兼容包主题细分:
(以'com.android.support:appcompat-v7:25.1.0'为例:)

  • AlertDialog.AppCompat 对话框深色
  • AlertDialog.AppCompat.Light 对话框浅色
  • Animation.AppCompat.Dialog 带动画效果的对话框
  • Animation.AppCompat.DropDownUp
  • Theme.AppCompat 作用于Activity层面以上的主题
  • Base、Platform 作为父类被继承的,一般不直接使用
  • RtlOverlay.Widget.AppCompat
  • RtlUnderlay.Widget.AppCompat
  • TextAppearance.AppCompat 文字样式相关
  • ThemeOverlay.AppCompat
  • Widget.AppCompat 控件相关的主题

关于Theme.ApCompat兼容主题
主题间的继承关系:(以Theme.AppCompat为例)
Theme.AppCompat ——> Base.Theme.AppCompat
Base.Theme.AppCompat ——> Base.V.Theme.AppCompat (可能是7、21、23等)
Base.V*.Theme.AppCompat ——> Platform.AppCompat
Platform.AppCompat ——> android:Theme
其中第二步:版本25.1.0有四种选择:Base、Base.V21、Base.V22、Base.V23。(更早的版本还有V7、V11等)
兼容:App在运行时会根据系统的版本选择对应的父类主题。大于21选择V21,大于22选择V22

例如:使用DatePicker、CalendarView等在不同版本手机上安装会展示不同的样式,在4.2的手机上展示holo的样式,在5.1的手机上展示material样式。

App的UI一致性:不少App为了保证在不同手机上的UI一致性,会给控件显式指定样式,为了向下兼容,通常会使用holo样式,并做一下调整。

系统通常预定义的主题样式

  • Theme.AppCompat 深色主题
  • Theme.AppCompat.NoActionBar 没有ActionBar
  • Theme.AppCompat.Dialog 对话框适用
  • Theme.AppCompat.Dialog.Alert 警告框适用(根据屏幕决定宽度)
  • Theme.AppCompat.Dialog.MinWidth 对话框适用(根据内容决定宽度)
  • Theme.AppCompat.DialogWhenLarge 充满屏幕(继承自Theme.AppCompat,但没有扩展)
  • Theme.AppCompat.CompactMenu 看名字是用于Menu菜单。未验证
    其他主题系统默认都会有上述几种类型的子主题,以此类推就好。
    例如:浅色主题只需要将Theme.AppCompat 替换成 Theme.AppCompat.Light即可

常见的样式属性摘记

  • android:windowFullscreen 隐藏状态栏
  • windowActionBar 是否显示ActionBar
  • windowNoTitle 是否显示TitleBar,经常和windowActionBar一起使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容