若是咱們常常須要對某個類型的組件指定大體類似的格式,好比字體、顏色、背景色等,若是每次都對view組件重複設置這些屬性,這無疑增大了工做量,並且不利於項目的後期維護。css
其實android裏面的style有點相似css,若是有網站開發經驗的同窗,來理解style來講,是比較好理解的。java
樣式資源android
Android的樣式資源文件也放在/res/values目錄下,樣式資源文件的根元素是<resource.../>元素,並且在<resource../>中又能夠包括多個<style.../>子元素,每一個<style../>元素定義一個樣式。style元素定義有如下屬性:
app
name : 指定樣式的名稱 parent :指定樣式所繼承的父樣式,當繼承某個父樣式時,該樣式將具備父樣式中定義的全部格式。固然,當前樣式也能夠覆蓋父樣式中的格式。
<style.../>元素內能夠包含多個<item.../>子元素,每一個<item.../>子元素定義一個格式項
例如以下實例: ide
<?xml version="1.0" encodig="utf-8"?> <resource> <style name="style1"> <item name="android:textSize">20sp</item> <item name="android:textColor">#00d</item> </style> <style name="style2" parent="style1"> <item name="android:background">#ee6</item> <item name="android:padding">8dp</item> <!--覆蓋父樣式中指定的屬性--> <item name="android:textColor">#000</item> </style> </resource>
上面的樣式資源中定義了兩個樣式,其中第二個樣式繼承了第一個樣式,並且第二個樣式中的textColor屬性覆蓋了父樣式中的textColor屬性。佈局
一旦定義了上面的樣式資源後,接下來就能夠在XML資源中按照以下語法格式來使用樣式了:字體
@[<package_name>]style/file_name
下面是該實例中的界面佈局文件,該佈局文件中包含兩個文本框,這兩個文本框分別使用兩個樣式。網站
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/style1" android:text="@string/style1"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/style2" android:text="@string/style2"/> </LinearLayout>
上面的界面佈局文件中,並未爲兩個文本框指定恩和格式,只是爲他們分別指定了使用style1.style2的樣式,這兩個樣式包含的格式就會應用到這兩個文本框。spa
主題資源code
與樣式資源很是類似,主題資源xml文件一般也放在res/values目錄下,主題資源的XML文檔一樣以<resource.../>元素做爲根元素,一樣使用<style.../>元素來定義主題。
主題和樣式的區別體如今:
主題不能做用於單個的View組件,主體應該對整個應用綜的全部Activity起做用,或對指定的Activity起做用
主題定義的格式應該是改變窗口外觀的格式,例如窗口標題。窗口邊框等
實例:給全部窗口添加邊框、背景
下面經過一個實例來介紹主題的用法。爲了給全部窗口添加邊框、背景、先在/res/values/my_style.xml文件中添加一個主題,定義主體的<style.../>片斷以下:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Crazy_theme"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:windowFrame">@drawable/abc_btn_check_material</item> <item name="android:windowBackground">@drawable/abc_btn_check_to_on_mtrl_015</item> </style> </resources>
定義了上面的主題以後,接下來就能夠在Java代碼中使用這個主題了,例如
public class MainActivity extends Activity{ private ListView listView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.Crazy_theme); setContentView(R.layout.activity_main); } }
大部分時候,在AndroidManifest.xml文件中對指定應用、Activity應用主題更加簡單。若是咱們想讓應用的所有窗體使用該主題,只要爲<application.../>元素添加android:theme屬性,屬性值是一個主題的名字,以下代碼所示:
<application android:theme="@style/CrazyitTheme"> ... </application>
若是你指向讓程序中的某個activity擁有這個主題,那麼你能夠修改成<activity.../>元素,一樣android:theme指定主題便可。
本應用在AndroidManifest.xml文件的<application../>元素中添加了android:theme="@style/CrazyTheme"屬性。
Android中提供了幾種內置的主題資源,這些主題經過查詢Android.R.style類能夠看到。
與樣式相似的是,Android主題一樣支持繼承。若是開發過程當中還想利用某個主題,但須要對他進行局部修改,則可經過繼承系統主題來實現自定義主題。例如以下代碼片斷:
<style name="CrazyTheme" parent="@android:style/Theme.Dialog"> ... </style>
上面定義的CrazyTheme主題繼承了android.R.style.Theme.Dialog主題,那麼接下來在該<style.../>元素中添加的<item.../>子元素可覆蓋系統主題的部分屬性了