Android主題定製及修改
簡介:在寫Android的App時,我們在Layout中的xml檔案中都會引用到大量的布局組件及風格,有時Android提供的原生組件並不能滿足我們的需求,這時我們就要考慮對style及theme進行定製及修改。
布局檔案的解釋原理:
在Layout的每一個控制項如TextView、EditText、Button等,例如Button控制項,在目錄frameworks/base/core/java/android/widget/下存在Button.java這個檔案,在Button.java代碼:
public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}
public Button(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
在layout中的布局控制項就是引用的Button.java這個控制,寫完App程式進行編譯時間,它會自動引用及關聯相應的控制項定義。第一個建構函式是Button的預設style,而第二個會根據寫app寫的style進行選擇需要的style.Button繼承自TextView.java,在這個檔案中的建構函式會看到選擇的過程,這個建構函式是相當龐大的一個函數。
Button.java有引用相關的style及主題,例如在Button.java就引用了buttonStyle這個style,在寫layout就可以在Button這個控制中加入這個style,所有的風格的定義都是在framework中的在frameworks/base/core/res/res/values/themes_device_defaults.xml有關於所有style的theme的名字,這些style的定義在frameworks/base/core/res/res/values/styles_device_defaults.xml檔案中,進擴充Item便可以得到某個style的的所有屬性。
在styles.xml存在這個的定義:
<style name="Widget.DeviceDefault.Button" parent="Widget.Holo.Button" >
</style>
這裡的Widget.DeviceDefault.Button繼承自Widget.Holo.Button,這裡Widget.Holo.Button style便擁有Widget.Holo.Button 控制項上的所有屬性及功能,這裡跟類繼承非常類似,如果不需要Widget.Holo.Button控制項的一些item,可以進行重寫,
<style name="Widget.DeviceDefault.Button" parent="Widget.Holo.Button" >
<item name="android:textColor">@android:color/XXX</item>
</style>
便對android:textcolor進行了複寫,這裡把XXX可以在一個xml定義,並寫上相應的顏色值,由於在framework中進行了修改,所有在app中引用的這個控制項都將進行修改。如果不想在所有的app中這個控制項都起作用,便可以在app中對這個控制項進行重寫。將style寫在一個app的layout中的xml檔案,只對此app起作用。