引言
本篇內(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)
- 系統(tǒng)的主題
- 第三方庫(kù)的主題
- 兼容包如support_v7.jar的主題
- 用戶(hù)自定義的主題
二服傍、引用方式
- 系統(tǒng)主題: "@android:style/Theme.Holo.Light"
- 兼容包: AndroidManifests.xml中"@style/Theme.Appcompat",其他地方使用“Theme.Appcompat”即可
- 自定義主題:"@style/AppTheme"
三骂铁、Theme的版本分類(lèi)
- android:Theme API 1 開(kāi)始
- android:Theme.Holo API 11(android3.0) 開(kāi)始
- android:Theme.DeviceDefault API 14(android4.0) 開(kāi)始
- android:Theme.Material API 21(android5.0) 開(kāi)始
- 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一起使用