Ya, ada satu cara:
Misalkan Anda memiliki deklarasi atribut untuk widget Anda (dalam attrs.xml
):
<declare-styleable name="CustomImageButton">
<attr name="customAttr" format="string"/>
</declare-styleable>
Deklarasikan atribut yang akan Anda gunakan untuk referensi gaya (dalam attrs.xml
):
<declare-styleable name="CustomTheme">
<attr name="customImageButtonStyle" format="reference"/>
</declare-styleable>
Deklarasikan sekumpulan nilai atribut default untuk widget (dalam styles.xml
):
<style name="Widget.ImageButton.Custom" parent="android:style/Widget.ImageButton">
<item name="customAttr">some value</item>
</style>
Deklarasikan tema khusus (dalam themes.xml
):
<style name="Theme.Custom" parent="@android:style/Theme">
<item name="customImageButtonStyle">@style/Widget.ImageButton.Custom</item>
</style>
Gunakan atribut ini sebagai argumen ketiga dalam konstruktor widget Anda (dalam 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();
}
}
Sekarang Anda harus menerapkan Theme.Custom
ke semua aktivitas yang menggunakan CustomImageButton
(di AndroidManifest.xml):
<activity android:name=".MyActivity" android:theme="@style/Theme.Custom"/>
Itu saja. Sekarang CustomImageButton
mencoba untuk memuat nilai atribut default dari customImageButtonStyle
atribut tema saat ini. Jika atribut seperti itu tidak ditemukan dalam tema atau nilai atribut @null
maka argumen terakhir untuk obtainStyledAttributes
akan digunakan: Widget.ImageButton.Custom
dalam kasus ini.
Anda dapat mengubah nama semua instance dan semua file (kecuali AndroidManifest.xml
) tetapi akan lebih baik menggunakan konvensi penamaan Android.
customImageButtonStyle
dalam jawaban ini). Begitulah cara bilah tindakan disesuaikan di Android. Dan jika Anda bermaksud mengubah tema pada waktu proses, pendekatan ini tidak mungkin dilakukan.name="CustomTheme"
dideclare-styleable
atribut wrapper memiliki tujuan apa pun? Apakah itu hanya untuk organisasi, karena saya tidak melihatnya digunakan di mana pun. Bisakah saya meletakkan semua atribut gaya saya untuk berbagai widget dalam satu pembungkus?Aspek lain selain jawaban michael yang luar biasa adalah mengganti atribut khusus dalam tema. Misalkan Anda memiliki sejumlah tampilan kustom yang semuanya merujuk ke atribut kustom "custom_background".
<declare-styleable name="MyCustomStylables"> <attr name="custom_background" format="color"/> </declare-styleable>
Dalam sebuah tema Anda menentukan apa nilainya
<style name="MyColorfulTheme" parent="AppTheme"> <item name="custom_background">#ff0000</item> </style>
atau
<style name="MyBoringTheme" parent="AppTheme"> <item name="custom_background">#ffffff</item> </style>
Anda dapat merujuk ke atribut dengan gaya
<style name="MyDefaultLabelStyle" parent="AppTheme"> <item name="android:background">?background_label</item> </style>
Perhatikan tanda tanya, seperti yang juga digunakan untuk referensi atribut android seperti pada
?android:attr/colorBackground
Seperti yang diketahui oleh sebagian besar dari Anda, Anda dapat -dan mungkin harus- menggunakan referensi @color alih-alih warna yang di-hardcode.
Jadi kenapa tidak lakukan saja
<item name="android:background">@color/my_background_color</item>
Anda tidak dapat mengubah definisi "my_background_color" saat runtime, sedangkan Anda dapat dengan mudah mengganti tema.
sumber