Hiểu cách kiểu Android hoạt động có thể hơi lộn xộn một chút.
Tôi sẽ cố gắng giải thích cách luồng công việc cơ bản sẽ như thế nào, dựa trên ví dụ.
Giả sử bạn muốn biết nền mặc định cho các nút là gì. Điều này có thể là một màu đơn giản (không chắc) hoặc có thể vẽ được (có nhiều loại hình có thể rút khác nhau).
Android có Chủ đề. Một chủ đề về cơ bản xác định kiểu nào được áp dụng cho tiện ích con nào. Vì vậy, bước đầu tiên của chúng tôi là tìm chủ đề android mặc định.
Bạn tìm thấy nó dưới android-sdk\platforms\android-15\data\res\values\themes.xml
Trong file theme này, tìm kiếm button
.
Bạn sẽ tìm thấy một cái gì đó như thế này:
<!-- Button styles -->
<item name="buttonStyle">@android:style/Widget.Button</item>
Điều này có nghĩa rằng các chủ đề áp dụng phong cách Widget.Button
để nút.
Ok, giờ hãy tìm kiểu Widget.Button
.
Tất cả các mặc định phong cách Android được định nghĩa trong file android-sdk\platforms\android-15\data\res\values\styles.xml
Bây giờ tìm kiếm Widget.Button
Bạn sẽ tìm thấy một cái gì đó như thế này:
<style name="Widget.Button">
<item name="android:background">@android:drawable/btn_default</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item>
<item name="android:textColor">@android:color/primary_text_light</item>
<item name="android:gravity">center_vertical|center_horizontal</item>
</style>
Dòng thú vị là:
<item name="android:background">@android:drawable/btn_default</item>
Điều này có nghĩa là có thể vẽ được btn_default
làm nền nút.
Bây giờ, chúng tôi cần tìm một tệp có tên btn_default.*
trong một trong các thư mục có thể kéo theo android-sdk\platforms\android-15\data\res
.
Đây có thể là hình ảnh (rất khó xảy ra) hoặc tệp xml như btn_default.xml
.
Sau một chút tìm kiếm bạn sẽ tìm thấy các tập tin android-sdk\platforms\android-15\data\res\drawable\btn_default.xml
Nó chứa một cái gì đó như thế này:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/btn_default_normal" />
<item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/btn_default_normal_disable" />
<item android:state_pressed="true" android:drawable="@drawable/btn_default_pressed" />
<item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/btn_default_selected" />
<item android:state_enabled="true" android:drawable="@drawable/btn_default_normal" />
<item android:state_focused="true" android:drawable="@drawable/btn_default_normal_disable_focused" />
<item android:drawable="@drawable/btn_default_normal_disable" />
</selector>
Bây giờ bạn phải hiểu rằng đây là một drawable selector (một trong nhiều loại drawable). Bộ chọn này chọn các hình nền khác nhau, dựa trên trạng thái nút. Ví dụ, nếu các nút được nhấn, nó có một nền khác.
Không xem xét trạng thái mặc định.
<item android:state_enabled="true" android:drawable="@drawable/btn_default_normal" />
Nó áp dụng đối tượng vẽ được gọi là btn_default_normal
.
Bây giờ chúng ta cần phải tìm thấy điều này có thể vẽ được.
Một lần nữa, chúng tôi cần tìm một tệp có tên btn_default_normal.*
trong một trong các thư mục có thể kéo theo android-sdk\platforms\android-15\data\res
.
Đây có thể là hình ảnh hoặc tệp xml như btn_default_normal.xml
.
Bạn sẽ tìm thấy nhiều tệp có tên 'btn_default_normal.9.png' trong các thư mục có thể vẽ khác nhau cho các độ phân giải khác nhau.
:) Bây giờ bạn biết rằng btn_default_normal.9.png
được đặt làm nền nút.
Cảm ơn !! rất tốt giải thích. – Zombie
Wow, đó là một câu trả lời tuyệt vời :) – theapache64