Frage

Ich habe ein eigenes Widget für ein Steuerelement geschrieben, dass wir überall in unserer Anwendung verwenden. Die Widget-Klasse abgeleitet von ImageButton und erweitert sie in ein paar einfachen Möglichkeiten. Ich habe einen Stil definiert, die ich auf das Widget anwenden kann, wie es verwendet wird, aber ich würde es vorziehen, diese nach oben durch ein Thema zu setzen. In R.styleable sehe ich Widget-Stil Attribute wie imageButtonStyle und textViewStyle. Gibt es eine Möglichkeit etwas wie das für die benutzerdefinierte zu erstellen Widget ich geschrieben habe?

War es hilfreich?

Lösung

Ja, es gibt einen Weg:

Angenommen, Sie eine Erklärung über die Attribute für Ihr Widget haben (in attrs.xml):

<declare-styleable name="CustomImageButton">
    <attr name="customAttr" format="string"/>
</declare-styleable>

Deklarieren Sie ein Attribut, das Sie für einen Stil Referenz verwenden (in attrs.xml):

<declare-styleable name="CustomTheme">
    <attr name="customImageButtonStyle" format="reference"/>
</declare-styleable>

Deklarieren Sie eine Reihe von Standardattributwerte für das Widget (in styles.xml):

<style name="Widget.ImageButton.Custom" parent="android:style/Widget.ImageButton">
    <item name="customAttr">some value</item>
</style>

Deklarieren Sie ein eigenes Thema (in themes.xml):

<style name="Theme.Custom" parent="@android:style/Theme">
    <item name="customImageButtonStyle">@style/Widget.ImageButton.Custom</item>
</style>

Verwenden Sie dieses Attribut als drittes Argument in Konstruktor Ihre Widgets (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 ); // see below
        this.customAttr =
            array.getString( R.styleable.CustomImageButton_customAttr, "" );
        array.recycle();
    }
}

Nun müssen Sie Theme.Custom für alle Aktivitäten, die Verwendung CustomImageButton (in AndroidManifest.xml) gelten:

<activity android:name=".MyActivity" android:theme="@style/Theme.Custom"/>

Das ist alles. Nun versucht zu laden Standardattributwerte von CustomImageButton Attribute des aktuellen Themas customImageButtonStyle. Wenn kein solches Attribut wird in dem Thema oder Attributwert gefunden ist @null dann wird das letzte Argument zu obtainStyledAttributes verwendet werden. Widget.ImageButton.Custom in diesem Fall

Sie können Namen aller Instanzen ändern und alle Dateien (außer AndroidManifest.xml), aber es wäre besser, Android Namenskonvention zu verwenden.

Andere Tipps

Ein weiterer Aspekt neben Michaels ausgezeichnete Antwort überschreibt benutzerdefinierte Attribute in Themen. Angenommen, Sie haben eine Reihe von benutzerdefinierten Ansichten, die alle auf das benutzerdefinierte Attribut „custom_background“ beziehen.

<declare-styleable name="MyCustomStylables">
    <attr name="custom_background" format="color"/>
</declare-styleable>

In einem Thema definieren Sie, was der Wert ist

<style name="MyColorfulTheme" parent="AppTheme">
    <item name="custom_background">#ff0000</item>
</style>

oder

<style name="MyBoringTheme" parent="AppTheme">
    <item name="custom_background">#ffffff</item>
</style>

Sie können in einem Stil

auf das Attribut beziehen
<style name="MyDefaultLabelStyle" parent="AppTheme">
    <item name="android:background">?background_label</item>
</style>

Beachten Sie die Fragezeichen, als auch als Referenz Android-Attribut verwendet, wie in

?android:attr/colorBackground

Wie die meisten von euch bemerkt haben, können Sie -und wahrscheinlich should- Verwendung @color Referenzen statt hart codierten Farben.

Warum also nicht einfach tun,

<item name="android:background">@color/my_background_color</item>

Sie können nicht die Definition von „my_background_color“ zur Laufzeit ändern, während Sie leicht die Themen wechseln können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top