好比系統有一個內建屬性selectableItemBackground
,能夠爲可點擊控件設置點擊時的水波紋效果,如下幾種方法均可以成功引用android
// 未設置前
<Button
/>
// 設置水波紋點擊效果
<Button
、、、
android:foreground="?android:attr/selectableItemBackground"/>
// 省略attr/
<Button
、、、
android:foreground="?android:selectableItemBackground"/>
// 省略android:
<Button
、、、
android:foreground="?attr/selectableItemBackground"/>
// 省略android:attr/
<Button
、、、
android:foreground="?selectableItemBackground"/>
複製代碼
咱們先在attrs.xml文件中自定義一個屬性bash
<?xml version="1.0" encoding="utf-8"?>
<resources>
// 經過format能夠設置各類不一樣的類型,包括style,這裏再也不贅述
<attr name="myTextColor" format="color"/>
</resources>
複製代碼
此時若是直接引用是沒有效果的,並且會報錯微信
<Button
、、、
android:textColor="?attr/myTextColor"
複製代碼
咱們還須要在styles.xml文件中爲這個自定義屬性設置一個默認值,而後再引用就能夠成功了,這裏咱們把Button的文字設置成紅色ide
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="myTextColor">#ff0000</item>
</style>
</resources>
複製代碼
固然,和內建屬性的引用同樣,咱們也能夠省略掉attr/ui
// 省略掉attr/也是能夠引用成功的
<Button
、、、
android:textColor="?myTextColor"
複製代碼
android:
,但也能夠省略,自定義屬性則不能夠加?attribute
,建議該寫法比較簡短參考spa
有一個想法,能夠經過在不一樣的主題中定義同一個自定義屬性的不一樣默認值,而後經過setTheme();
方法來切換主題,立刻驗證下.net
首先在attrs.xml文件中自定義一個屬性code
<?xml version="1.0" encoding="utf-8"?>
<resources>
// 經過format能夠設置各類不一樣的類型,包括style,這裏再也不贅述
<attr name="myTextColor" format="color"/>
</resources>
複製代碼
而後在styles.xml中定義兩個不一樣的themeorm
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="myTextColor">#ff0000</item>
</style>
<style name="AppThemeGreen" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="myTextColor">#00ff00</item>
</style>
複製代碼
原本想經過Application.setTheme();
方法來設置主題,但發現未生效,具體緣由還未去深究,如今只能經過調用Activity.setTheme();
方法來設置出題,且必須在setContentView();
方法前調用,不然沒法生效,能夠將Activity.setTheme();
調用寫在基類BaseActivity的onCreate方法裏。cdn
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setTheme(R.style.AppTheme);
// 能夠有一個換膚的頁面供選擇,而後把選擇的選擇的theme保存到Sharepreference中
setTheme(R.style.AppThemeGreen);
setContentView(R.layout.activity_main);
}
複製代碼
總結:
缺點: 1.假設有個換膚選擇的Activity頁面,選擇後沒法實時生效,需重啓Activity。就是說已打開的Activity是沒法立刻看到效果的,新打開的Activity纔可以看到換膚效果。 2.該換膚實現方式的全部主題需寫死在styles.xml文件內,沒法實現後臺下載新皮膚。至於下載新皮膚網上有經過apk文件的方式,之後能夠深刻研究下。
若是喜歡個人文章,能夠掃描如下二維碼關注個人微信公衆號,我會按期發佈最新的文章。