Android自定義主題樣式詳解(結合自定義title欄講解)
此篇文章將總結主題樣式的自定義并且結合實例自定義title欄進行講解。為了方便閱讀,在此先寫明文章結構:
1.對android主題樣式的理解 (簡略結合系統自帶樣式的講解)
2.如何自定義主題樣式 (主要,有例子)
3.如何自定義title欄(例子)
一、對android主題樣式的理解
1.首先要先理解android app的各個部分的名稱、概念。如下圖
這里寫圖片描述
這個就是app的各個部分的名稱,一會的自定義主題樣式的item設置就與他們有關啦!
2.對大體主題樣式的說明:
(這里的雙括號本來是單括號來的,可是涉及到Markdown語法,會缺失文字,所以用一邊雙括號代替)
1.在res/values 目錄下新建一個名叫style.xml的文件。增加一個<resources>根節點。
2.對每一個風格和主題,給《style>element增加一個全局唯一的名字,也可以選擇增加一個父類屬性。在后邊我們可以用這個名字來應用風格,而父類屬性標識了當前風格是繼承于哪個風格。
3.在《style>元素內部,申明一個或者多個《item>,每一個《item>定義了一個名字屬性,并且在元素內部定義了這個風格的值。
4.你可以應用在其他XML定義的資源。
3.進而要舉例說明(用系統的新建工程舉例)
這里寫圖片描述
首先我們知道系統新建的工程是activity是繼承AppCompatActivity的(注意這里,繼承這個activity,那就只能用它的子類樣式了喔),然后通過查看AndroidManifest知道,我們可以去styles.xml查看這個activity的主題,代碼如下:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
我們對著本文第一張來看,colorPrimary是我們所謂的title欄,colorPrimaryDark是系統欄,colorAccent就是如圖了(只能意會了)。而且,我們要注意這個主題的繼承,繼承的是AppCompat的子類主題,想起我們剛剛系統自帶的activity也是繼承這個父類activity就知道,我們的mainactivity不能使用這個AppCompat父類activity以外的主題了喔。
二、自定義主題樣式
1.先給個例子看看
第一張
這里寫圖片描述
第二張
這里寫圖片描述
第三張
這里寫圖片描述
可以很明顯滴看到這三個主題是不同的。
第一個的代碼是:
<style name="WindowTitleBackground" >
<item name="android:background">@color/title_blue</item>
</style>
<style name="MyTheme" parent="android:Theme">
<item name="android:windowTitleSize">50dp</item>
<item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
</style>
可以看到繼承的一個主題是為了設置系統欄和標題欄(windowTitleBackgroundStyle,而且win也可以看到我們設置了主題的高度50dp)的樣式的。
第二個的代碼是:
<style name="WindowTitleBackground" >
<item name="android:background">@color/title_blue</item>
</style>
<style name="MyTheme" parent="android:Theme">
<item name="android:windowTitleSize">50dp</item>
<item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
<item name="android:windowBackground">@color/white</item>
</style>
可以看到我設置了一個屬性windowBackground,可以查看本文的第一張圖,就是那來變成了白色。
第三個的代碼是
<style name="WindowTitleBackground" >
<item name="android:background">@color/title_blue</item>
</style>
<style name="MyTheme" parent="android:Theme">
<item name="android:windowTitleSize">50dp</item>
<item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
<item name="android:background">@color/white</item>
</style>
可以看我的設置多了一個item(理解:相當于布局中設置多了一個屬性)
設置的item是background顏色白色,他會掩蓋我們設置的系統欄和狀態欄顏色的喔!!
2.對一些可以進行設置的item屬性進行講解(不過要注意繼承是什么activity,如果是系統自帶的AppCompat就有查文檔了,如果想純粹自定義就繼承Activity,或者像我上面的例子那樣,繼承Theme)
!!!這些要像我上面那樣,當成item屬性進行添加帶style里面喔!!!!
這些屬性很明顯的,一些設置的是true或者flase,一些是設置資源引用
android:theme="@android:style/Theme.Dialog" :Activity顯示為對話框模式
android:theme="@android:style/Theme.NoTitleBar" :不顯示應用程序標題欄
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" :不顯示應用程序標題欄,并全屏
android:theme="Theme.Light ": 背景為白色
android:theme="Theme.Light.NoTitleBar" :白色背景并無標題欄
android:theme="Theme.Light.NoTitleBar.Fullscreen" :白色背景,無標題欄,全屏
android:theme="Theme.Black" : 背景黑色
android:theme="Theme.Black.NoTitleBar" :黑色背景并無標題欄
android:theme="Theme.Black.NoTitleBar.Fullscreen" :黑色背景,無標題欄,全屏
android:theme="Theme.Wallpaper" : 用系統桌面為應用程序背景
android:theme="Theme.Wallpaper.NoTitleBar" :用系統桌面為應用程序背景,且無標題欄
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" :用系統桌面為應用程序背景,無標題欄,全屏
android:theme="Theme.Translucent : 透明背景
android:theme="Theme.Translucent.NoTitleBar" :透明背景并無標題
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" :透明背景并無標題,全屏
android:theme="Theme.Panel ": 面板風格顯示
android:theme="Theme.Light.Panel" : 平板風格顯示
三、自定義title欄
1.先查看本身activity繼承的什么父類activity
2.自定義style樣式
3.編寫標題欄的布局
4.代碼引用(一個是在mainactivity引用,一個是在AndroidManifest文件的修改)
舉例!!!!
1.我的mainactivity關鍵代碼:
public class MainActivity extends Activity implements android.view.View.OnClickListener
繼承的是activity
2.自定義title樣式
<style name="WindowTitleBackground">
<item name="android:background">@color/title_blue</item>
</style>
<style name="MyTheme" parent="android:Theme">
<item name="android:windowTitleSize">50dp</item>
<item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
<item name="android:windowBackground">@color/white</item>
</style>
3.title欄的布局(可以看到使用的菜單圖標跟系統的不一樣!!)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:orientation="vertical">
<TextView
android:layout_width="10dp"
android:layout_height="8dp" />
<ImageView
android:layout_width="40dp"
android:layout_height="30dp"
android:background="@drawable/menu"/>
</LinearLayout>
</RelativeLayout>
4.代碼的引用
(1)在AndroidManifest里面的修改
<activity android:name=".activity.MainActivity" android:theme="@style/MyTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
可以看到activity引用的主題是我剛剛自定義的
(2)在activity里面的引用
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);//自定義標題,去掉系統的標題欄
setContentView(R.layout.activity_main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);//設置標題為某個layout
來自:http://www.jianshu.com/p/0f7362be3904