Frage

Ich schreibe ein paar benutzerdefinierte Ansichten, die einige gleiche genannten Attribute teilen. In ihrem jeweiligen <declare-styleable> Abschnitt in attrs.xml würde Ich mag die gleichen 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 eine Fehlermeldung, dass myattr1 und myattr2 sind bereits definiert. Ich fand, dass ich das format Attribut für myattr1 und myattr2 in MyView2 auslassen sollte, aber wenn ich das tun, ich folgende Fehlermeldung in der Konsole erhalten:

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

Gibt es eine Weise, die ich dies erreichen könnte, vielleicht eine Art Namensräume (nur raten)?

War es hilfreich?

Lösung

Lösung: Sie einfach extrahieren gemeinsame Attribute aus beiden Ansichten und fügen Sie sie direkt als Kinder des <resources> Knoten:

<?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>

Andere Tipps

Ich veröffentliche diese Antwort als die oben gepostete Lösung nicht für mich trainierte im Android Studio. Ich brauche meine benutzerdefinierten Attribute zu meinen benutzerdefinierten Ansichten zu teilen, damit ich die obige Lösung in Android Studio versucht, hatte aber kein Glück. Also ich experimentieren und einen Weg gehen, um es zu tun. Hoffe, dass es jemand helfen könnte, für das gleiche Problem suchen.

  <?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>

Dies funktioniert für mich völlig. Wir brauchen einen Elternteil styleable machen und dann müssen wir das übergeordnete styleable erben. Zum Beispiel, wie ich getan habe oben: Übergeordnetes styleable Name MyView und erbte dies zu meinen anderen styleable wie MYVIEW1 und MyView2 sind.

Als Priya Singhal beantwortet, erfordert Android Studio die gemeinsamen Attributnamen in ihren eigenen Stil Namen definiert werden. Sie können sich nicht mehr an der Wurzel sein.

Es gibt jedoch ein paar andere Dinge zu beachten (weshalb ich auch bin Zugabe eine Antwort):

  • Die gemeinsamen Stile brauchen nicht das gleiche wie ein Blick benannt werden. (Danke an diese Antwort für das aus zeigt.)
  • Sie brauchen nicht zu verwenden Vererbung mit einem Elternteil.

Beispiel

Hier ist, was ich kürzlich in einem Projekt haben, die zwei benutzerdefinierte Ansichten hat, dass beide teilen die gleichen Attribute. Solange die benutzerdefinierten Ansichten noch die Namen für die Attribute und enthalten keine format, kann ich immer noch Zugriff auf sich wie gewohnt von Code.

<?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

In der Tat, ich brauche nicht einmal die Attribute unter einem benutzerdefinierten Namen zu setzen. Solange ich sie definieren (geben ihnen eine format) für mindestens eine benutzerdefinierte Ansicht, ich sie überall (ohne format) verwenden können. So dies auch funktioniert (und sieht sauberer):

<?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>

Für ein großes Projekt, obwohl, könnte dies chaotisch und in einem einzigen Standort aus sie an der Spitze definieren könnte besser sein (wie empfohlen hier ).

Dank Lewis Ich hatte das gleiche Problem, und Ihr Erbe Lösung gab mir den Hinweis, es zu tun, wie unten und es funktioniert fine.I nur gemeinsame Attribute auf der oben angegebenen und schreiben sie in den Körper Stildeklaration wieder ohne Formatierung. Ich hoffe, es hilft jemand

<?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>

Für den Fall, jemand noch mit diesem Problem nach dem versuchten verfügbaren Lösung fest. Ich steckte mit Add subtitle Attribute mit string Format.

Meine Lösung ist das Format entfernen.

vor:

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

nach:

<attr name="subtitle"/>

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