it-swarm.com.de

Attribute mit demselben Namen in attrs.xml für die benutzerdefinierte Ansicht

Ich schreibe ein paar benutzerdefinierte Ansichten, die einige Attribute mit demselben Namen teilen. In ihrem jeweiligen Abschnitt <declare-styleable> In attrs.xml Möchte ich dieselben Namen für Attribute verwenden:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView1">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>
</resources>

Ich erhalte die Fehlermeldung, dass myattr1 Und myattr2 Bereits definiert sind. Ich habe festgestellt, dass ich das format -Attribut für myattr1 Und myattr2 In MyView2 Weglassen sollte, aber wenn ich das tue, erhalte ich den folgenden Fehler in der Konsole :

[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute 

Gibt es eine Möglichkeit, dies zu erreichen, vielleicht eine Art Namensraum (nur Vermutung)?

157
Venator85

Lösung: Extrahieren Sie einfach gemeinsame Attribute aus beiden Ansichten und fügen Sie sie direkt als untergeordnete Elemente des Knotens <resources> Hinzu:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myattr1" format="string" />
    <attr name="myattr2" format="dimension" />

    <declare-styleable name="MyView1">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>
</resources>
351
Venator85

Ich poste diese Antwort, da die oben aufgeführte Lösung in Android Studio nicht funktioniert hat. Ich muss meine benutzerdefinierten Attribute für meine benutzerdefinierten Ansichten freigeben, also habe ich die oben aufgeführte Lösung in = ausprobiert Android Studio hatte aber kein Glück. Also experimentiere ich und gehe einen Weg, um es zu tun. Hoffe, es könnte jemandem helfen, der nach dem gleichen Problem sucht.

  <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <!-- parent styleable -->
     <declare-styleable name="MyView">
         <attr name="myattr1" format="string" />
         <attr name="myattr2" format="dimension" />
     </declare-styleable>

     <!-- inheriting parent styleable -->
     <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
    <declare-styleable name="MyView1" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myBackgroundColor" format="color"/>
    </declare-styleable>


    <!-- inheriting parent styleable -->
    <!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
    <declare-styleable name="MyView2" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myfont" format="string"/>
        ...
    </declare-styleable>
</resources>

Das funktioniert bei mir völlig. Wir müssen einen Parent stilisierbar machen und dann diesen Parent stilisierbar erben. Zum Beispiel, wie ich es oben getan habe: Übergeordneter stilisierbarer Name MyView und erbte diesen an meinen anderen stilisierbaren Namen wie MyView1 bzw. MyView2.

41
Priya Singhal

Wie Priya Singhal antwortete, erfordert Android Studio, dass die allgemeinen Attributnamen in ihrem eigenen Stilnamen definiert werden. Sie können nicht mehr an der Wurzel sein.

Es gibt jedoch noch ein paar andere Dinge zu beachten (aus diesem Grund füge ich auch eine Antwort hinzu):

  • Die gebräuchlichen Stile müssen nicht dasselbe wie eine Ansicht heißen. (Danke an diese Antwort für den Hinweis.)
  • Sie müssen keine Vererbung mit einem übergeordneten Element verwenden.

Beispiel

Folgendes habe ich in einem kürzlich durchgeführten Projekt mit zwei benutzerdefinierten Ansichten ausgeführt, die beide dieselben Attribute aufweisen. Solange die benutzerdefinierten Ansichten noch die Namen für die Attribute enthalten und kein format enthalten, kann ich über Code wie gewohnt darauf zugreifen.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- common attributes to all custom text based views -->

    <declare-styleable name="TextAttributes">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <!-- custom text views -->

    <declare-styleable name="View1">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

Optimiertes Beispiel

Tatsächlich muss ich die Attribute nicht einmal unter einen benutzerdefinierten Namen setzen. Solange ich sie für mindestens eine benutzerdefinierte Ansicht definiere (ihnen ein format geben), kann ich sie überall verwenden (ohne das format). Das funktioniert also auch (und sieht sauberer aus):

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="View1">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

Bei einem großen Projekt kann dies jedoch zu Problemen führen, und es ist möglicherweise besser, sie oben an einem einzigen Ort zu definieren (wie empfohlen hier ).

24
Suragch

Vielen Dank, Lewis, ich hatte das gleiche Problem, und Ihre Vererbungslösung gab mir den Hinweis, wie unten beschrieben vorzugehen, und es funktioniert einwandfrei. Ich habe oben nur gemeinsame Attribute deklariert und es ohne Formatierung erneut in den Hauptteil der Stildeklaration geschrieben. Ich hoffe es hilft jemandem

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes -->
     <attr name="myattr1" format="string" />
     <attr name="myattr2" format="dimension" />

 <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
<declare-styleable name="MyView1" >
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myBackgroundColor" format="color"/>
</declare-styleable>

<!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
<declare-styleable name="MyView2" parent="MyView">
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myfont" format="string"/>
    ...
</declare-styleable>
7
Hanieh Variani

Nur für den Fall, dass jemand nach einer ausprobierten verfügbaren Lösung immer noch bei diesem Problem steckt. Ich blieb beim Hinzufügen des Attributs subtitle mit dem Format string.

Meine Lösung ist das Format entfernen.

vor:

<attr name="subtitle" format="string"/>

nach:

<attr name="subtitle"/>

1
Ahmad Muzakki