Oui, il y a un moyen:
Supposons que vous ayez une déclaration d'attributs pour votre widget (in attrs.xml
):
<declare-styleable name="CustomImageButton">
<attr name="customAttr" format="string"/>
</declare-styleable>
Déclarez un attribut que vous utiliserez pour une référence de style (dans attrs.xml
):
<declare-styleable name="CustomTheme">
<attr name="customImageButtonStyle" format="reference"/>
</declare-styleable>
Déclarez un ensemble de valeurs d'attribut par défaut pour le widget (in styles.xml
):
<style name="Widget.ImageButton.Custom" parent="android:style/Widget.ImageButton">
<item name="customAttr">some value</item>
</style>
Déclarez un thème personnalisé (dans themes.xml
):
<style name="Theme.Custom" parent="@android:style/Theme">
<item name="customImageButtonStyle">@style/Widget.ImageButton.Custom</item>
</style>
Utilisez cet attribut comme troisième argument dans le constructeur de votre widget (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();
}
}
Vous devez maintenant appliquer Theme.Custom
à toutes les activités qui utilisent CustomImageButton
(dans AndroidManifest.xml):
<activity android:name=".MyActivity" android:theme="@style/Theme.Custom"/>
C'est tout. Essaie maintenant CustomImageButton
de charger les valeurs d' customImageButtonStyle
attribut par défaut à partir de l' attribut du thème actuel. Si aucun attribut de ce type n'est trouvé dans le thème ou la valeur de l'attribut est @null
alors le dernier argument à obtainStyledAttributes
sera utilisé: Widget.ImageButton.Custom
dans ce cas.
Vous pouvez modifier les noms de toutes les instances et de tous les fichiers (sauf AndroidManifest.xml
), mais il serait préférable d'utiliser la convention de dénomination Android.