Ich arbeite an einem Beispiel zu Support Library und Toolbar, dies ist der Code des Layouts in der Android-Dokumentation
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
Es ist das erste Mal, dass ich diese sehe ?attr
und ich habe keine Ahnung, was sie bedeuten oder wo diese Werte gespeichert sind. Sind diese benutzerdefiniert oder im Android-Framework vordefiniert?
Bezug: Android Toolbar-Dokumentation
?attr/
Verweise auf Attribute. Attribute sind Werte, die im Design einer App angegeben sind. Die Attribute in Ihrem Beispiel sind alle Werte, die in den Themen angegeben sind, die von der Support-Bibliothek bereitgestellt werden. Android hat auch seine ganz eigenen Attribute, mit denen verwendet werden kann ?android:attr/
.
Der tatsächliche Wert, der am Ende verwendet wird, hängt von dem Thema ab, das zum Aufblasen des besagten Layouts verwendet wird. Dieses Thema kann im Manifest in der angegeben werden <application/>
Block für ein App-weites Thema oder in der <activity/>
Sperre für eine bestimmte Aktivität. Sie können dieses Thema auch während der Laufzeit überschreiben, indem Sie einen anderen Kontext verwenden (siehe ContextThemeWrapper und LayoutInflater)
Es wird als bewährte Methode angesehen, Designattribute anstelle von hartcodierten Werten in Ihren Layouts zu verwenden, da dies eine einfache Anpassung ermöglicht. Wenn Sie beispielsweise benutzerdefinierte Ansichten erstellen, können Sie verwenden ?attr/colorAccent
sodass der Benutzer der Ansicht keine Farbe angeben muss und die verwendet wird colorAccent
stattdessen in den App-Designs verwendet.
Dies wird heute noch relevanter, da Ihre Layouts mit der Einführung von Dark Themes in Android Q ein Attribut angeben sollten, damit der Endwert unterschiedlich ist, wenn Sie ein helles Design von einem dunklen Design verwenden.
Mit einer Stilattributressource können Sie auf den Wert eines Attributs im aktuell angewendeten Thema verweisen.
https://developer.android.com/guide/topics/resources/accessing-resources.html#ReferencesToThemeAttributes
Anstatt eine statische Farbe festzulegen (#ffffff
oder ein @color
Ressource) können wir an das Thema delegieren, indem wir die verwenden ?attr/themeAttributeName
Syntax. Diese Syntax bedeutet: Fragen Sie das Design nach dem Wert dieses semantischen Attributs ab.
Dies Post on Medium gibt eine ziemlich detaillierte Erklärung zu Stilen und Themen.