Có, có một cách:
Giả sử bạn có một khai báo các thuộc tính cho tiện ích con của mình (trong attrs.xml
):
<declare-styleable name="CustomImageButton">
<attr name="customAttr" format="string"/>
</declare-styleable>
Khai báo thuộc tính bạn sẽ sử dụng cho tham chiếu kiểu (in attrs.xml
):
<declare-styleable name="CustomTheme">
<attr name="customImageButtonStyle" format="reference"/>
</declare-styleable>
Khai báo một tập hợp các giá trị thuộc tính mặc định cho tiện ích con (trong styles.xml
):
<style name="Widget.ImageButton.Custom" parent="android:style/Widget.ImageButton">
<item name="customAttr">some value</item>
</style>
Khai báo một chủ đề tùy chỉnh (trong themes.xml
):
<style name="Theme.Custom" parent="@android:style/Theme">
<item name="customImageButtonStyle">@style/Widget.ImageButton.Custom</item>
</style>
Sử dụng thuộc tính này làm đối số thứ ba trong hàm tạo của tiện ích con của bạn (in CustomImageButton.java
):
public class CustomImageButton extends ImageButton {
private String customAttr;
public CustomImageButton( Context context ) {
this( context, null );
}
public CustomImageButton( Context context, AttributeSet attrs ) {
this( context, attrs, R.attr.customImageButtonStyle );
}
public CustomImageButton( Context context, AttributeSet attrs,
int defStyle ) {
super( context, attrs, defStyle );
final TypedArray array = context.obtainStyledAttributes( attrs,
R.styleable.CustomImageButton, defStyle,
R.style.Widget_ImageButton_Custom );
this.customAttr =
array.getString( R.styleable.CustomImageButton_customAttr, "" );
array.recycle();
}
}
Bây giờ bạn phải áp dụng Theme.Custom
cho tất cả các hoạt động sử dụng CustomImageButton
(trong AndroidManifest.xml):
<activity android:name=".MyActivity" android:theme="@style/Theme.Custom"/>
Đó là tất cả. Bây giờ CustomImageButton
cố gắng tải các giá trị thuộc tính mặc định từ customImageButtonStyle
thuộc tính của chủ đề hiện tại. Nếu không tìm thấy thuộc tính như vậy trong chủ đề hoặc giá trị của thuộc tính @null
thì đối số cuối cùng obtainStyledAttributes
sẽ được sử dụng: Widget.ImageButton.Custom
trong trường hợp này.
Bạn có thể thay đổi tên của tất cả các phiên bản và tất cả các tệp (ngoại trừ AndroidManifest.xml
) nhưng sẽ tốt hơn nếu sử dụng quy ước đặt tên của Android.