Theme(主題) Style(風(fēng)格)

ToolBar.jgp.JPG
](http://www.jizhuomi.com/android/course/221.html)

Android主題(Theme)和風(fēng)格(Style)

1. Android主題(Theme)和風(fēng)格(Style)概述

類(lèi)似Web開(kāi)發(fā)中总处,HTML代碼負(fù)責(zé)內(nèi)容部分增淹,CSS部分負(fù)責(zé)表現(xiàn)部分,可以把內(nèi)容和形式分離開(kāi)油湖。同樣在Android的開(kāi)發(fā)中,我們可以使用Theme、Style+UI組件的方式嚣鄙,實(shí)現(xiàn)內(nèi)容和形式的分離,做到界面的自定義串结。這樣可以避免重復(fù)的工作哑子,而且便于后期項(xiàng)目的維護(hù)。

風(fēng)格Style是一個(gè)包含一種或多種格式化屬性的集合肌割,你可以把它應(yīng)用在UI組件上卧蜓。主題Theme也是一個(gè)包含一種或多種格式化屬性的集合,你可以把它應(yīng)用在整個(gè)應(yīng)用程序(Application)中或者某個(gè)窗口(Activity)中.

定義一個(gè)style或者theme的方法是一樣的把敞。在res/values/目錄下簡(jiǎn)歷style.xml或者theme.xml文件烦却,在xml中建立形如這樣的代碼:

theme和style一樣可以繼承

自定義主題(Theme)和風(fēng)格(Style)

2.Android 中的Theme和Style使用

  1. Android的style的使用
    在res/values/styles.xml中resource中定義三個(gè)樣式,
<style name = "TextView">
<item name = "android:textSize">38sp</item>
<item name = "android:textColor">#128</item>
<item name = "android:shadowRadius">1.0</item>
<item name = "android:background">#035</item>
</style>

<style name = "EditText">
...
</style>
<style name = "Button">
...
</item>

然后在res/layout文件下的activity_main.xml中的控件中引用剛才定義的Style先巴。

<TextView
android:id = "@+id/textView1"
style = "@style/TextView"
android:layout_width = "wrap_content"
android:layout_height="wrap_content"
android:text = "@string/hello_world">

<Button
...
/>
...
  1. Android的Theme的使用
    首先在res/values/themes.xml定義Theme
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme" parent="android:Theme.Light">
<item name="android:windowFullscreen">true</item>
<item name="android:windowTitleSize">60dip</item>
<item name="android:windowTitleStyle">@style/WindowTitl</item>
<item name="android:background">#234</item>
</style>
<style name="WindowTitle">
<item name="android:singleLine">true</item>
<item name="android:shadowColor">#658</item>
<item name="android:shadowRadius">2.75</item>
</style> 
</resources>
在mainfest.xml中應(yīng)用主題:

然后在AndroidManifest.xml中使用剛才定義的主題其爵。
只要定義application的android:theme屬性為style/Theme即可

<application
android:allowBackup="true"
android:icon = "@drawable/ic_launcher"
android:label = "@string/app_name"
android:theme = "@style/Theme">
<activity
android:name = ""
android:label="@string/app_name">
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
在程序中使用主題的方法:

也可以用setTheme(R.style.Theme)來(lái)調(diào)用主題。

protected void onCreate(Bundle savedInstanceState) {      
super.onCreate(savedInstanceState);      
setTheme(android.R.style.Theme_Light);          
setContentView(R.layout.linear_layout_3);
}

一些補(bǔ)充

Android風(fēng)格與主題(style and theme)

theme和style文件中資源引用方式

我們用@符號(hào)和伸蚯?符號(hào)來(lái)應(yīng)用資源摩渺。@符號(hào)表明了我們應(yīng)用的資源是前邊定義過(guò)的(或者在前一個(gè)項(xiàng)目中或者在Android 框架中)。問(wèn)號(hào)剂邮?表明了我們引用的資源的值在當(dāng)前的主題當(dāng)中定義過(guò)摇幻。

Android中提供了幾種內(nèi)置的資源,有好幾種主題你可以切換而不用自己寫(xiě)挥萌。比如你可以用對(duì)話(huà)框主題來(lái)讓你的Activity看起來(lái)像一個(gè)對(duì)話(huà)框绰姻。在manifest中定義如下:

<activity android:theme=”@android:style/Theme.Dialog”>
繼承,用parent實(shí)現(xiàn)

如果你喜歡一個(gè)主題引瀑,但是想做一些輕微的改變狂芋,你只需要將這個(gè)主題添加為父主題。比如我們修改Theme.Dialog主題憨栽。我們來(lái)繼承Theme.Dialog來(lái)生成一個(gè)新的主題帜矾。

<style name=”CustomDialogTheme” parent=”@android:style/Theme.Dialog”>

繼承了Theme.Dialog后,我們可以按照我們的要求來(lái)調(diào)整主題屑柔。我們可以修改在Theme.Dialog中定義的每個(gè)item元素的值屡萤,然后我們?cè)贏ndroid Manifest 文件中使用CustomDialogTheme 而不是 Theme.Dialog 。


style掸宛,可繼承的樣式死陆,可以參照sdk的
docs/guide/topics/ui/themes.html#PlatformStyles文件

在style中可以定義的屬性,可以參考sdk的
docs/reference/android/R.attr.html

需要查閱系統(tǒng)自帶的主題唧瘾,可以在文檔的
reference-->android-->R.style 中查看措译。


Android:Theme.Material和Theme.AppCompat

引用張鴻洋的博客

首先要了解的當(dāng)然是其主題的風(fēng)格以及app bar.

Material Design的Theme

md的主題有:
@android:style/Theme.Material
@android:style/Theme.Material.Light
@android:style/Theme.MaterialLight.DarkActionBar
與之對(duì)應(yīng)的Compat Theme:
Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar

個(gè)性化的Color Palette
我們可以根據(jù)我們的app風(fēng)格迫像,去定制Color Palette(調(diào)色板),重點(diǎn)有以下幾個(gè)屬性:

<resource>
<!-- Base application theme.-->
<style name = "AppBaseTheme" parent = "Theme.AppCompat">

<!-- customize the color palette -->
<item name = "colorPrimary">@color/material_blue_500</item>
<item name = "colorPrimaryDark">@color/material_blue_700</item>
<item name = "colorAccent">@color/material_green_A200</item>
</style>
</resources>

colorPrimary對(duì)應(yīng)ActionBar的顏色
colorPrimaryDark對(duì)應(yīng)狀態(tài)欄的顏色
colorAccent對(duì)應(yīng)EditText編輯時(shí)瞳遍、RadioButton選中闻妓、CheckBox等選中時(shí)的顏色。

AppCompat.jpg

metarial design的theme允許我們?nèi)ピO(shè)置status bar的顏色掠械,如果你項(xiàng)目的最小支持版本為5.0由缆,那么你可以使用android:Theme.Material
,設(shè)置android:statusBarColor
猾蒂。當(dāng)然了這種情況目前來(lái)說(shuō)比較少均唉,所以我們多數(shù)使用的是Theme.AppCompat
,通過(guò)設(shè)置android:colorPrimaryDark.
來(lái)設(shè)置status bar顏色肚菠。(ps:默認(rèn)情況下舔箭,android:statusBarColor
的值繼承自android:colorPrimaryDark
).

對(duì)于5.0以下的設(shè)備,目前colorPrimaryDark
無(wú)法去個(gè)性化狀態(tài)欄的顏色蚊逢;底部的navagationBar可能也不一樣层扶,更別說(shuō)設(shè)置顏色了

一個(gè)例子:

values/styles.xml

<resources>
<!--Base application theme. -->
<style name = "AppTheme" parent="AppBaseTheme">
</style>

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">    
<!-- Customize your theme here. -->    
<item name="colorPrimary">@color/material_blue_500</item>    
<item name="colorPrimaryDark">@color/material_blue_700</item>    
<item name="colorAccent">@color/material_green_A200</item>
</style>

values-v21/styles.xml

<resources>
<style name = "AppTheme" parent="AppBaseTheme">
<item name = "android:statusBarColor">@color/material_blue_700</item>
</style>
</resource>

values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>    
<color name="material_blue_500">#009688</color>        
<color name="material_blue_700">#00796B</color>    
<color name="material_green_A200">#FD87A9</color>
</resources>

ToolBar的使用

在使用ActionBar的時(shí)候,會(huì)很多問(wèn)題:這個(gè)文字能不能定制烙荷,位置能不能改變镜会,圖標(biāo)的間距怎么控制等等,ActionBar設(shè)計(jì)不靈活终抽。為此官方提供了ToolBar戳表,并且提供了support library用于向下兼容。

Toolbar之所以靈活昼伴,是因?yàn)樗鋵?shí)就是一個(gè)ViewGroup,我們?cè)谑褂玫臅r(shí)候和普通的組件一樣匾旭,在布局文件中聲明。

(1)ToolBar的引入

a) 隱藏原來(lái)的ActionBar
隱藏可以通過(guò)修改我們繼承的主題為:Theme.AppCompat.Light.NoActionBar,當(dāng)然也可以通過(guò)設(shè)置以下屬性完成:

<item name = "windowActionBar">false</item>
<item name = "android:windowNoTitle">true</item>

我們這里使用前者

<style name = "AppBaseTheme" parent = "Theme.AppCompat.Light.NoActionBar">
<!--customize the color palette -->
<item name="colorPrimary">@color/material_blue_500</item>    
<item name="colorPrimaryDark">@color/material_blue_700</item>    
<item name="colorAccent">@color/material_green_A200</item>
</style>

b)在布局文件中聲明

<android.support.v7.widget.Toolbar
android:id="@+id/id_toolbar"
android:layout_height = "wrap_content"
android:layout_width = "match_parent"
/>

實(shí)際使用布局文件

<LinearLayout     
xmlns:android="http://schemas.android.c     
om/apk/res/android" 
android:layout_width="match_parent" 
android:orientation="vertical" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<android.support.v7.widget.Toolbar 
android:id="@+id/id_toolbar" 
android:layout_height="wrap_content" 
android:layout_width="match_parent" /> 
<android.support.v7.widget.GridLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center_horizonta"    app:useDefaultMargins="true" 
app:columnCount="3"> 

<TextView 
android:text="First Name:" 
app:layout_gravity="right" /> 

<EditText 
android:ems="10" 
app:layout_columnSpan="2" /> 
<TextView 
android:text="Last Name:" 
app:layout_column="0" 
app:layout_gravity="right" /> 
<EditText 
android:ems="10" 
app:layout_columnSpan="2" /> 
<TextView 
android:text="Visit Type:" 
app:layout_column="0" 
app:layout_gravity="right" /> 
<RadioGroup 
app:layout_columnSpan="2"> 
<RadioButton 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Business" /> 
<RadioButton 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Social" /> 
</RadioGroup> 
<Button 
android:text="Ok" 
app:layout_column="1" /> 
<Button 
android:text="Cancel" 
app:layout_column="2" /> 
</android.support.v7.widget.GridLayout>
</LinearLayout>

c)代碼中設(shè)定

public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Toolbar toolbar=(Toolbar)findViewById(R.id.id_toolbar);
setSupportActionBar(toolbar);
}

ok,就是先隱藏ActionBar圃郊,然后在布局文件中聲明价涝,最后代碼中設(shè)定以下。現(xiàn)在看一下效果圖:

ToolBar.jgp.JPG

可以看到我們的ToolBar顯示出來(lái)了描沟,默認(rèn)的Title為T(mén)oolBar飒泻,但是這個(gè)樣式實(shí)在是不敢恭維鞭光,下面看我們?nèi)绾味ㄖ扑?/p>

(2)定制ToolBar
首先給它一個(gè)nice的背景色吏廉,還記得前面的colorPrimary么,用于控制ActionBar的背景色的惰许。當(dāng)然這里我們的ToolBar就是一個(gè)普通的ViewGroup在布局中席覆,所以我們直接使用background就好,值可以為:?attr/colorPrimary使用主題中定義的值汹买。

ToolBar中包含Nav Icon,Logl,Title,Sub Title, Menu Items.
我們可以通過(guò)代碼設(shè)置上述ToolBar中的控件:

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Toolbar toolbar=(Toolbar)findViewById(R.id.id_toolbar);

//App Logo
toolbar.setLogo(R.mipmap.ic_launcher);
//Title
toolbar.setTitle("App Title");
//Sub Title
toolbar.setSubtitle("Sub title");

setSupportActionBar(toolbar);
//Navigation Icon
toolbar.setNavigationIcon(R.drawable.ic_toc_white_24dp);

可選方案佩伤,當(dāng)然如果你喜歡聊倔,也可以在布局文件中去設(shè)置部分屬性:

<android.support.v7.widget.Toolbar 
android:id="@+id/id_toolbar" 
app:title="App Title" 
app:subtitle="Sub Title" 
app:navigationIcon="@drawable/ic_toc_white_24dp" 
android:layout_height="wrap_content" 
android:minHeight="?attr/actionBarSize" 
android:layout_width="match_parent" 
android:background="attr/colorPrimary"/>

至于Menu Item,依然支持在menu/menu_main.xml去聲明生巡,然后復(fù)寫(xiě)onCreateOptionsMenu和onOptionsItemSelected即可耙蔑。

可選方案,也可以通過(guò)
toolbar.setOnMenuItemClickListener實(shí)現(xiàn)點(diǎn)擊MenuItem的回調(diào)

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 
@Override 
public boolean     onMenuItemClick(MenuItem item) { 
return false; 
} 
});

效果圖

toolbar_效果圖.JPG

關(guān)于字體的樣式孤荣,可以在布局文件設(shè)置屬性
app:titleTextApperance,
app:subtitleTextApperance
或者代碼
setTitleTextApperance,
setSubTitleTextApperance
設(shè)置


實(shí)戰(zhàn)

簡(jiǎn)單介紹Toolbar后甸陌,計(jì)劃整合Toolbar、DrawerLayout盐股、ActionBarDrawerToggle寫(xiě)個(gè)實(shí)用的例子钱豁。

大致思路:
整體實(shí)現(xiàn)還是比較容易的,首先需要引入DrawerLayout疯汁,(如果你對(duì)DrawerLayout不了解牲尺,可以參考 Android DrawerLayout 高仿QQ5.2雙向側(cè)滑菜單),然后去初始化mActionBarDrawerToggle,mActionBarDrawerToggle實(shí)際上是個(gè)DrawerListener幌蚊,設(shè)置mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);就已經(jīng)能夠?qū)崿F(xiàn)上面點(diǎn)擊Nav Icon切換效果了谤碳。當(dāng)然了細(xì)節(jié)還是挺多的。

我們的效果圖溢豆,左側(cè)菜單為Fragment估蹄,內(nèi)容區(qū)域?yàn)镕ragment,點(diǎn)擊左側(cè)菜單切換內(nèi)容區(qū)域的Fragment即可沫换。關(guān)于Fragment的知識(shí)臭蚁,可以查看:Android Fragment 你應(yīng)該知道的一切

.布局文件:
activity_main.xml


參考

Android 中的Theme和Style使用

http://www.360doc.com/content/15/1229/14/7510008_523940779.shtml

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讯赏,隨后出現(xiàn)的幾起案子垮兑,更是在濱河造成了極大的恐慌,老刑警劉巖漱挎,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件系枪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡磕谅,警方通過(guò)查閱死者的電腦和手機(jī)私爷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膊夹,“玉大人衬浑,你說(shuō)我怎么就攤上這事》排伲” “怎么了工秩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我助币,道長(zhǎng)浪听,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任眉菱,我火速辦了婚禮迹栓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俭缓。我一直安慰自己迈螟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布尔崔。 她就那樣靜靜地躺著答毫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪季春。 梳的紋絲不亂的頭發(fā)上洗搂,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音载弄,去河邊找鬼耘拇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宇攻,可吹牛的內(nèi)容都是我干的惫叛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逞刷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘉涌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起夸浅,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仑最,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帆喇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體警医,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年坯钦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了预皇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婉刀,死狀恐怖吟温,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情路星,我是刑警寧澤溯街,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布诱桂,位于F島的核電站洋丐,受9級(jí)特大地震影響呈昔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜友绝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一堤尾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迁客,春花似錦郭宝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至卜范,卻和暖如春衔统,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背海雪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工锦爵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奥裸。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓险掀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親湾宙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子樟氢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評(píng)論 25 707
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線(xiàn)程,因...
    小菜c閱讀 6,432評(píng)論 0 17
  • afinalAfinal是一個(gè)android的ioc侠鳄,orm框架 https://github.com/yangf...
    passiontim閱讀 15,435評(píng)論 2 45
  • 今天…我把看見(jiàn)味道的少女看完了…沒(méi)錯(cuò) 一天刷完一部劇…破了我當(dāng)初三天刷完盛夏晚晴天的記錄…怎么說(shuō)呢… 如果有人還沒(méi)...
    橘子罐頭iKyyy閱讀 220評(píng)論 0 0
  • 下一波財(cái)富是什么畦攘? 下一波財(cái)富就是來(lái)到無(wú)極霸妹,穿越你的身體來(lái)傳遞信息。這是我給到所有人的答案知押,這一刻我在告訴你用無(wú)極...
    簡(jiǎn)寧寶兒閱讀 468評(píng)論 0 0