向檢視新增屬性
自定義檢視還可以採用可在 Android 佈局資原始檔中使用的自定義屬性。要向自定義檢視新增屬性,你需要執行以下操作:
-
定義屬性的名稱和型別: 這是在
res/values/attrs.xml
內完成的(必要時建立它)。以下檔案定義了笑臉的面部顏色的顏色屬性和笑臉表情的列舉屬性:<resources> <declare-styleable name="SmileyView"> <attr name="smileyColor" format="color" /> <attr name="smileyExpression" format="enum"> <enum name="happy" value="0"/> <enum name="sad" value="1"/> </attr> </declare-styleable> <!-- attributes for other views --> </resources>
-
在佈局中使用你的屬性: 這可以在使用自定義檢視的任何佈局檔案中完成。以下佈局檔案建立一個帶有快樂黃色笑臉的螢幕:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_height="match_parent" android:layout_width="match_parent"> <com.example.app.SmileyView android:layout_height="56dp" android:layout_width="56dp" app:smileyColor="#ffff00" app:smileyExpression="happy" /> </FrameLayout>
提示:自定義屬性不適用於 Android Studio 2.1 及更早版本(以及可能的未來版本)中的
tools:
字首。在這個例子中,用tools:smileyColor
替換app:smileyColor
將導致smileyColor
既不在執行時也不在設計時設定。 -
閱讀你的屬性: 這是在你的自定義檢視原始碼中完成的。以下的
SmileyView
片段演示瞭如何提取屬性:public class SmileyView extends View { // ... public SmileyView(Context context) { this(context, null); } public SmileyView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SmileyView, defStyleAttr, 0); mFaceColor = a.getColor(R.styleable.SmileyView_smileyColor, Color.TRANSPARENT); mFaceExpression = a.getInteger(R.styleable.SmileyView_smileyExpression, Expression.HAPPY); // Important: always recycle the TypedArray a.recycle(); // initPaints(); ... } }
-
(可選)新增預設樣式: 通過新增具有預設值的樣式並將其載入到自定義檢視中來完成此操作。以下預設笑臉樣式代表一個快樂的黃色樣式:
<!-- styles.xml --> <style name="DefaultSmileyStyle"> <item name="smileyColor">#ffff00</item> <item name="smileyExpression">happy</item> </style>
通過將它新增為
obtainStyledAttributes
呼叫的最後一個引數(參見步驟 3 中的程式碼),將其應用於我們的SmileyView
:TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SmileyView, defStyleAttr, R.style.DefaultSmileyViewStyle);
請注意,在膨脹的佈局檔案中設定的任何屬性值(請參閱步驟 2 中的程式碼)都將覆蓋預設樣式的相應值。
-
(可選)在主題中提供樣式: 這是通過新增新樣式引用屬性來完成的,該屬性可以在主題中使用併為該屬性提供樣式。這裡我們簡單地命名我們的引用屬性
smileyStyle
:<!-- attrs.xml --> <attr name="smileyStyle" format="reference" />
然後我們在我們的應用主題中提供樣式(這裡我們只重用步驟 4 中的預設樣式):
<!-- themes.xml --> <style name="AppTheme" parent="AppBaseTheme"> <item name="smileyStyle">@style/DefaultSmileyStyle</item> </style>