設計良好的自訂檢視區塊就像任何其他設計精良的類別一樣。它會封裝 一組特定的 可透過簡單介面輕鬆使用 CPU 和記憶體等。於 設計完善的類別,自訂檢視區塊必須執行以下操作:
- 符合 Android 標準。
- 提供可與 Android XML 版面配置搭配使用的自訂樣式屬性。
- 傳送無障礙功能事件。
- 與多個 Android 平台相容。
Android 架構提供一組基礎類別和 XML 標記,協助您建立檢視畫面 符合上述所有 Google Cloud 就是最佳選擇本課程將說明如何使用 Android 架構建立核心 檢視畫面功能 類別
如要進一步瞭解 自訂檢視畫面元件一文。
將檢視畫面設為子類別
Android 架構中定義的所有檢視區塊類別,都會擴充
View
。您的
也可透過自訂檢視畫面
您可以直接擴充 View
,或者也可以
擴充 Kubernetes 叢集
現有資料檢視
子類別,例如 Button
如要允許 Android Studio 與您的檢視畫面互動,您至少必須提供一個能接收
Context
和 AttributeSet
物件做為參數。
此建構函式允許版面配置編輯器建立及編輯檢視畫面的例項。
Kotlin
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
Java
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
定義自訂屬性
如要將內建的 View
新增至使用者介面,請在 XML 元素中指定並
控制
呈現這些元素您也可以新增自訂樣式
資料檢視目的地:
在自訂檢視畫面中啟用這項行為,請按照下列步驟操作:
- 在
<declare-styleable>
資源元素中為檢視畫面定義自訂屬性。 - 在 XML 版面配置中指定屬性值。
- 在執行階段擷取屬性值。
- 將擷取的屬性值套用至檢視畫面。
本節會探討如何定義自訂屬性及指定其值。 下一節涵蓋 在執行階段擷取及套用值
如要定義自訂屬性,請在專案中加入 <declare-styleable>
資源。將這些資源放在
res/values/attrs.xml
檔案。接下來
attrs.xml
檔案的範例:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
這個程式碼宣告了兩個自訂屬性 showText
和 labelPosition
。
屬於某個可自訂樣式的
名為「PieChart
」的實體。可設定樣式的實體名稱依照慣例,也就是
做為
類別名稱
定義自訂檢視畫面雖然您不需要遵守這個慣例
許多熱門程式碼
編輯必須遵循這項命名慣例,才能提供完整的陳述式。
定義自訂屬性後,即可像內建屬性一樣在版面配置 XML 檔案中使用這些屬性
屬性。只有
差別在於自訂屬性屬於不同的命名空間。非歸屬感
屬於 http://schemas.android.com/apk/res/android
命名空間,屬於 http://schemas.android.com/apk/res/[your package name]
。以下舉例說明
定義
PieChart
:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
為避免需要重複較長的命名空間 URI,此範例會使用
xmlns
指令。這個指令會將別名 custom
指派給
命名空間 http://schemas.android.com/apk/res/com.example.customviews
您可以為命名空間選擇任何別名。
請注意,用於將自訂檢視區塊新增至版面配置的 XML 標記名稱。這一切
完整名稱
自訂檢視區塊類別。如果檢視區塊類別是內部類別,請進一步驗證類別
我們會與檢視區塊的外部類別命名
舉例來說,
PieChart
類別具有名為 PieView
的內部類別。如要使用
自訂屬性
使用 com.example.customviews.charting.PieChart$PieView
標記。
套用自訂屬性
透過 XML 版面配置建立檢視畫面時,系統會讀取 XML 標記中的所有屬性
從資源中移除
並傳遞至檢視畫面的建構函式
AttributeSet
。
雖然
可以直接讀取 AttributeSet
中的值
有一些缺點:
- 系統不會解析屬性值中的資源參照。
- 未套用樣式。
請改為將 AttributeSet
傳遞至
obtainStyledAttributes()
。
這個方法會傳回一個
TypedArray
陣列的
屬於
已解除參照和設定樣式
Android 資源編譯器進行大量呼叫
obtainStyledAttributes()
讓您更容易每 <declare-styleable>
所產生的 R.java
會定義 res/
目錄中的屬性陣列
以及一組
定義陣列中每項屬性索引的常數。您可以使用預先定義的
要讀取的常數
TypedArray
中的屬性。方法如下
PieChart
類別
讀取其屬性:
Kotlin
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
Java
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
請注意,TypedArray
物件
這項共用資源
且在使用後必須回收。
新增資源和事件
屬性是控制檢視畫面行為和外觀的強大方法
這些模型只能讀取
當檢視區塊初始化時。如要提供動態行為,請公開屬性 getter 和
個別的 setter 組合
自訂屬性。下列程式碼片段顯示 PieChart
如何公開屬性
名為 showText
:
Kotlin
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
Java
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
請注意,setShowText
呼叫 invalidate()
和 requestLayout()
。這些呼叫很重要
確保檢視畫面能穩定運作您需要具備
,在可能變更資料檢視的屬性後失效
這樣
系統就會知道需要重新繪製同樣地,在下列情況下,您必須要求新的版面配置:
資源變更方式
可能會影響檢視畫面的大小或形狀清除這些方法呼叫可能會導致
很難找到
蟲子
自訂檢視畫面也必須支援事件監聽器,用來傳送重要事件。適用對象
執行個體,PieChart
會公開名為 OnCurrentItemChanged
的自訂事件,以通知事件監聽器
使用者旋轉了
製作圓餅圖。
很容易忘記公開屬性和事件,特別是當你是唯一的使用者時 自訂檢視區塊 花時間仔細定義檢視區塊的介面,可減少日後的維護成本 。 建議您一律公開所有會影響 外觀或行為 自訂檢視畫面
將無障礙設計納入設計考量
自訂檢視畫面必須支援各種使用者。這包括具有 身心障礙 防止使用者看到或使用觸控螢幕為協助身心障礙使用者 :
- 使用
android:contentDescription
為輸入欄位加上標籤 屬性。 - 呼叫
sendAccessibilityEvent()
來傳送無障礙功能事件 。 - 支援替代控制器,例如 D-Pad 或軌跡球。
如要進一步瞭解如何建立無障礙檢視畫面,請參閱 提高應用程式的無障礙程度。