重拾Android之路之開(kāi)發(fā)準(zhǔn)備


引言

本篇內(nèi)容就整理一下開(kāi)發(fā)Android的瑣事細(xì)節(jié)标捺。

主要分為以下幾個(gè)主題:

  • Android固定橫屏首有、豎屏
  • 橫豎屏切換的問(wèn)題
  • AppTheme屬性設(shè)置集合
  • Android Theme 主題總結(jié)

Android固定橫屏、豎屏

要實(shí)現(xiàn)這個(gè)目的泡挺,只需要在AndroidManifest.xml里聲明Activity的時(shí)候加上一個(gè)屬性:

android:screenOrientation="portrait"

屬性取值landscape為固定橫屏、portrait為固定豎屏。

上面的方式是通過(guò)修改AndroidManifest.xml的屬性來(lái)修改每個(gè)activity的橫豎屏設(shè)置妄痪。

下面來(lái)看看代碼設(shè)置橫豎屏:

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

對(duì)于單個(gè)Activity禁用橫豎屏切換是很簡(jiǎn)單的,但是實(shí)際項(xiàng)目中會(huì)有很多的Activity楞件,如果每個(gè)都設(shè)置一下就太麻煩了衫生。有沒(méi)有一處設(shè)置全局有效的方法呢?答案是有的土浸,只要對(duì)第二種方式稍微改造一下即可罪针。我們可以寫(xiě)一個(gè)如下的BaseActivity類(lèi):

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都繼承這個(gè)BaseActivity類(lèi)就能實(shí)現(xiàn)全局禁用橫豎屏切換了。實(shí)際開(kāi)發(fā)中常用這種方法黄伊,不僅僅是用來(lái)設(shè)置橫豎屏泪酱,還有其它的公共功能也可以寫(xiě)在BaseActivity中。繼承確實(shí)是個(gè)好東西还最。


橫豎屏切換的問(wèn)題

屏幕自動(dòng)切換時(shí)墓阀,默認(rèn)狀態(tài)的應(yīng)用程序,會(huì)重新調(diào)用onCreate拓轻,相當(dāng)于重新啟動(dòng)了一次應(yīng)用程序岂津。

同時(shí),layout可能因?yàn)闄M屏帶來(lái)不能合理適配的問(wèn)題悦即。為了解決旋屏和鍵盤(pán)切換引起的程序重啟問(wèn)題吮成,還需要增加一個(gè)屬性:android:configChanges。

這個(gè)屬性可以理解為一個(gè)監(jiān)聽(tīng)器辜梳,它將攔截旋屏和鍵盤(pán)切換事件粱甫,阻止程序重啟而變?yōu)榛卣{(diào)onConfigurationChanged方法。這里常用的屬性取值為:keyboardHidden|orientation作瞄。

android:configChanges="screenSize|keyboardHidden|orientation"
android:screenOrientation="sensor"    //sensor:旋屏茶宵,可切換橫豎屏

AppTheme屬性設(shè)置集合

現(xiàn)在新建一個(gè)項(xiàng)目基本都會(huì)在 style.xml 設(shè)置基礎(chǔ)的 AppTheme,但是系統(tǒng)的給提供的設(shè)置屬性又比較多宗挥。

所以在此收集記錄乌庶,以便之后查找方便种蝶。

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

    <!--狀態(tài)欄顏色,應(yīng)用的主要暗色調(diào)瞒大,statusBarColor默認(rèn)使用該顏色-->
    <item name="android:colorPrimaryDark">@color/material_animations_primary_dark</item>
    <!--狀態(tài)欄顏色螃征,默認(rèn)使用colorPrimaryDark-->
    <item name="android:statusBarColor">@color/material_animations_primary_dark</item>
    
    <!--Appbar背景色,應(yīng)用的主要色調(diào)透敌,actionBar默認(rèn)使用該顏色-->
    <item name="android:colorPrimary">@color/material_animations_primary</item>
    
    <!--頁(yè)面背景色-->
    <item name="android:windowBackground">@color/light_grey</item>
    
    <!--底部導(dǎo)航欄顏色-->
    <item name="android:navigationBarColor">@color/navigationColor</item>
    
    <!--應(yīng)用的主要文字顏色盯滚,actionBar的標(biāo)題文字默認(rèn)使用該顏色-->
    <item name="android:textColorPrimary">@android:color/black</item>
    
    <!--ToolBar上的Title顏色-->
    <item name="android:textColorPrimaryInverse">@color/text_light</item>
    
    <!--應(yīng)用的前景色,ListView的分割線酗电,switch滑動(dòng)區(qū)默認(rèn)使用該顏色-->
    <item name="android:colorForeground">@color/colorForeground</item>
    <!--應(yīng)用的背景色魄藕,popMenu的背景默認(rèn)使用該顏色-->
    <item name="android:colorBackground">@color/colorForeground</item>
    
    <!--各個(gè)控制控件的默認(rèn)顏色-->
    <item name="android:colorControlNormal">@color/colorControlNormal</item>
    <!--一般控件的選種效果默認(rèn)采用該顏色-->
    <item name="android:colorAccent">@color/colorAccent</item>
    <!--控件選中時(shí)的顏色,默認(rèn)使用colorAccent-->
    <item name="android:colorControlActivated">@color/colorControlActivated</item>
  
    <!--控件按壓時(shí)的色調(diào)-->
    <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>
    
    <!--默認(rèn)按鈕的背景顏色-->
    <item name="android:colorButtonNormal">@color/text_dark</item>
    
    <!--對(duì)話(huà)框的背景是否變暗-->
    <item name="android:backgroundDimEnabled">true</item>  

    <!--Activity 的切換動(dòng)畫(huà)背率。其引用的 activityAnim 也是 style ,需要繼承 parent="@android:style/Animation.Translucent"-->
    <item name="android:windowAnimationStyle">@style/activityAnim</item>

    <!--title 標(biāo)題欄字體設(shè)置-->
    <item name="android:titleTextAppearance">@style/MaterialAnimations.TextAppearance.Title</item>


    <!--允許使用transitions(過(guò)渡動(dòng)畫(huà))-->
    <item name="android:windowContentTransitions">true</item>
    <!--是否覆蓋執(zhí)行嫩与,其實(shí)可以理解成前后兩個(gè)頁(yè)面是同步執(zhí)行還是順序執(zhí)行-->
    <item name="android:windowAllowEnterTransitionOverlap">false</item>
    <!--與上面相同寝姿。即上一個(gè)設(shè)置了退出動(dòng)畫(huà),這個(gè)設(shè)置了進(jìn)入動(dòng)畫(huà)蕴纳,兩者是否同時(shí)執(zhí)行会油。-->
    <item name="android:windowAllowReturnTransitionOverlap">false</item>
</style>

Android Theme 主題總結(jié)

簡(jiǎn)介:主題決定了App的展示效果,我們可以為整個(gè)Application指定主題古毛,也可以為Activity單獨(dú)指定主題翻翩,甚至可以為各個(gè)控件如Button、TextView指定主題稻薇。下面對(duì)Android Theme的引用方式嫂冻,版本分類(lèi)進(jìn)行列舉,并對(duì)兼容包主題進(jìn)行了歸類(lèi)塞椎、總結(jié)桨仿。期望達(dá)到對(duì)Theme有一個(gè)總體的清晰的認(rèn)識(shí)。

一案狠、Theme的來(lái)源分類(lèi)

  1. 系統(tǒng)的主題
  2. 第三方庫(kù)的主題
  3. 兼容包如support_v7.jar的主題
  4. 用戶(hù)自定義的主題

二服傍、引用方式

  • 系統(tǒng)主題: "@android:style/Theme.Holo.Light"
  • 兼容包: AndroidManifests.xml中"@style/Theme.Appcompat",其他地方使用“Theme.Appcompat”即可
  • 自定義主題:"@style/AppTheme"

三骂铁、Theme的版本分類(lèi)

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

主題的不同版本:

Theme:

  • Theme 深色主題
  • Theme.Light 淺色主題

位置:sdk/platforms/android-25/data/res/values/themes.xml
簡(jiǎn)介:許多主題的最終父類(lèi)主題

Theme.Holo:

  • Theme.Holo 深色主題
  • Theme.Holo.Light 淺色主題

位置:sdk/platforms/android-25/data/res/values/themes_holo.xml
簡(jiǎn)介:android 11 - 13 的默認(rèn)主題

Theme.DeviceDefault:

  • Theme.DeviceDefault 深色主題
  • Theme.DeviceDefault.Light 淺色主題

位置:sdk/platforms/android-25/data/res/values/themes_device_defaults.xml
簡(jiǎn)介:android 14以上的默認(rèn)主題吹零,在不同系統(tǒng)版本的設(shè)備上可以提供不同的樣式

Theme.Material:

  • Theme.Material 深色主題
  • Theme.Material.Light 淺色主題

位置:sdk/platforms/android-25/data/res/values/themes_material.xml
簡(jiǎn)介:Material Design的樣式

Theme.Leanback :

位置:sdk/platforms/android-25/data/res/values/themes_leanback.xml
簡(jiǎn)介:不知道是什么主題,暫且羅列在此

AppCompat_v7兼容包主題細(xì)分:
(以'com.android.support:appcompat-v7:25.1.0'為例:)

  • AlertDialog.AppCompat 對(duì)話(huà)框深色
  • AlertDialog.AppCompat.Light 對(duì)話(huà)框淺色
  • Animation.AppCompat.Dialog 帶動(dòng)畫(huà)效果的對(duì)話(huà)框
  • Animation.AppCompat.DropDownUp
  • Theme.AppCompat 作用于Activity層面以上的主題
  • Base拉庵、Platform 作為父類(lèi)被繼承的灿椅,一般不直接使用
  • RtlOverlay.Widget.AppCompat
  • RtlUnderlay.Widget.AppCompat
  • TextAppearance.AppCompat 文字樣式相關(guān)
  • ThemeOverlay.AppCompat
  • Widget.AppCompat 控件相關(guān)的主題

關(guān)于Theme.ApCompat兼容主題
主題間的繼承關(guān)系:(以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在運(yùn)行時(shí)會(huì)根據(jù)系統(tǒng)的版本選擇對(duì)應(yīng)的父類(lèi)主題。大于21選擇V21窃蹋,大于22選擇V22

例如:使用DatePicker卡啰、CalendarView等在不同版本手機(jī)上安裝會(huì)展示不同的樣式静稻,在4.2的手機(jī)上展示holo的樣式警没,在5.1的手機(jī)上展示material樣式。

App的UI一致性:不少App為了保證在不同手機(jī)上的UI一致性振湾,會(huì)給控件顯式指定樣式杀迹,為了向下兼容,通常會(huì)使用holo樣式押搪,并做一下調(diào)整树酪。

系統(tǒng)通常預(yù)定義的主題樣式

  • Theme.AppCompat 深色主題
  • Theme.AppCompat.NoActionBar 沒(méi)有ActionBar
  • Theme.AppCompat.Dialog 對(duì)話(huà)框適用
  • Theme.AppCompat.Dialog.Alert 警告框適用(根據(jù)屏幕決定寬度)
  • Theme.AppCompat.Dialog.MinWidth 對(duì)話(huà)框適用(根據(jù)內(nèi)容決定寬度)
  • Theme.AppCompat.DialogWhenLarge 充滿(mǎn)屏幕(繼承自Theme.AppCompat,但沒(méi)有擴(kuò)展)
  • Theme.AppCompat.CompactMenu 看名字是用于Menu菜單大州。未驗(yàn)證
    其他主題系統(tǒng)默認(rèn)都會(huì)有上述幾種類(lèi)型的子主題续语,以此類(lèi)推就好。
    例如:淺色主題只需要將Theme.AppCompat 替換成 Theme.AppCompat.Light即可

常見(jiàn)的樣式屬性摘記

  • android:windowFullscreen 隱藏狀態(tài)欄
  • windowActionBar 是否顯示ActionBar
  • windowNoTitle 是否顯示TitleBar厦画,經(jīng)常和windowActionBar一起使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疮茄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子根暑,更是在濱河造成了極大的恐慌力试,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件排嫌,死亡現(xiàn)場(chǎng)離奇詭異畸裳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)淳地,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)怖糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颇象,你說(shuō)我怎么就攤上這事伍伤。” “怎么了夯到?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵嚷缭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阅爽,這世上最難降的妖魔是什么路幸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮付翁,結(jié)果婚禮上简肴,老公的妹妹穿的比我還像新娘。我一直安慰自己百侧,他們只是感情好砰识,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著佣渴,像睡著了一般辫狼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辛润,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天膨处,我揣著相機(jī)與錄音,去河邊找鬼砂竖。 笑死真椿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乎澄。 我是一名探鬼主播突硝,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼置济!你這毒婦竟也來(lái)了解恰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舟肉,失蹤者是張志新(化名)和其女友劉穎修噪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體路媚,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黄琼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了整慎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脏款。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖裤园,靈堂內(nèi)的尸體忽然破棺而出撤师,到底是詐尸還是另有隱情,我是刑警寧澤拧揽,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布剃盾,位于F島的核電站腺占,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痒谴。R本人自食惡果不足惜衰伯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望积蔚。 院中可真熱鬧意鲸,春花似錦、人聲如沸尽爆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漱贱。三九已至槐雾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饱亿,已是汗流浹背蚜退。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工闰靴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彪笼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓蚂且,卻偏偏與公主長(zhǎng)得像配猫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杏死,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容