android - wähle selectableItemBackground in XML mit Unterstützung v7 aus

73

auch mit Android Support v7 in meiner Anwendung enthalten

Hinzufügen android:background="?android:attr/selectableItemBackground"

Wenn meine IDE, Eclipse, einen Fehler auslöst (der mich am Kompilieren hindert), wird mir mitgeteilt, dass selectableItemBackground nur für mindestens Api 11 und höher gilt.

Wie füge ich dieses Attribut einem Hintergrund in XML hinzu?

Nehmen Sie an, dass das Kopieren und Einfügen aus einer höheren Bibliothek keine Lösung ist

CQM
quelle

Antworten:

215

Da das Attribut in einer Bibliothek definiert ist (Unterstützung v7), würden Sie es als benutzerdefiniertes Attribut verwenden: dh ohne das android:Präfix:

android:background="?attr/selectableItemBackground"

Der Fehler, den Sie sehen, weist darauf hin, dass er ?android:attr/selectableItemBackgroundfür API-Versionen> = 11 verfügbar ist.

Vikram
quelle
2
1) Woher wissen Sie, dass sich das Attribut in Support v7 und nicht in v4 befindet? (Ich lade gerade Version 19 der Support-Bibliothek herunter.) 2) Haben Sie ein Beispiel für den URI mit einem benutzerdefinierten Attribut?
Jemand irgendwo
2
@SomeoneSomewhere Nach allem, was ich sagen kann, definiert v4 keine Attribute. Ich weiß, dass dies selectableItemBackgroundin Version 7 definiert ist, indem ich auf android.support.v7.appcompat.R.attr schaue . Fragen Sie sich bei Ihrer zweiten Frage, wie ein benutzerdefiniertes Attribut funktioniert?
Vikram
Ich habe tatsächlich vergessen, was ich tat, als ich Frage 2 stellte. Ich glaube, der folgende Link hat diese Frage beantwortet, insbesondere den Kommentar: stackoverflow.com/a/11388952/550471
Jemand irgendwo
13
@SomeoneSomewhere Auf alles, was vom Android-System bereitgestellt wird, wird über das android:Namespace-Präfix zugegriffen . Dies schließt Support-Bibliotheken nicht ein, da es sich um Add-Ons handelt. Attribute werden in definiert attrs.xmlund in themes.xmlund / oder festgelegt styles.xml. Wenn Sie also Ihr eigenes Drawable zuweisen würden selectableItemBackground, würden Sie den android:Namespace nicht verwenden . Aber Sie werden, wenn das Drawable vom Android-System bereitgestellt wird.
Vikram
@ Vikram Wie setzen wir den Hintergrund mit Java auf "attr / selectableItemBackground"?
Prakhar
16

Hier ist selectedItemBackground. Sie finden es in /platforms/android-14/data/res/themes.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"
          android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:state_window_focused="false" android:drawable="@color/transparent" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="true"                                                             android:drawable="@drawable/list_selector_background_focused" />
    <item android:drawable="@color/transparent" />

</selector>

und Sie finden Drawables in Ihrem Android SDK-Verzeichnis

../platforms/android-14/data
Sonnig
quelle
1
Sie schlagen also vor, dass ich es in ein Thema oder ein eigenes Zeichen kopiere, anstatt mich zu fragen, wie ich es aus der Support-Bibliothek herausholen kann, die mit meiner älteren API-Ebene funktionieren soll.
CQM
Sie können eine Mindest-API von mehr als 11 festlegen, andernfalls müssen Sie Drawables von dort in Ihren resOrdner kopieren .
Sunny
Ich denke, ich sollte in der Lage sein, einen Namespace oder etwas
anderes festzulegen
Sie können die HoloEveryWhere-Bibliothek verwenden, dann funktioniert sie ab API 7+.
Sunny
Ich verwende die Android Support Library v7. Sie dient überall dem gleichen Zweck wie Holo. Nehmen wir an, die Support Library v7 ist mein einziges Tool. Wie erhalte ich das gleiche Ergebnis?
CQM
4

Kein Experte auf diesem Gebiet, aber es scheint, dass Sie ein plattformversionsbasiertes Theming benötigen. Der offizielle Leitfaden erklärt diesen Prozess ziemlich gut, denke ich.

Sie müssen verschiedene XML - Dateien für jede Version erstellen und speichern sie in res/values-v7, res/values-v11etc. Dann diese Stile für Ihre Ansichten verwenden. Etwas wie das:

in res/values-v7:

<style name="LightThemeSelector" parent="android:Theme.Light">
    ...
</style>

in res/values-v11:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    <item name="selectableItemBackground">?android:attr/selectableItemBackground</item>
    ...
</style>

Verwenden Sie dann den Stil für die Ansicht:

<TextView
    style="@style/LightThemeSelector"
    android:text="@string/hello" />

Hoffe das hilft. Prost.

Kraxor
quelle
Okay, dieses Element "? android: attr / selectableItemBackground" befindet sich bereits in der Android Support v7-Bibliothek. Ich sollte nicht kopieren und Themen aus anderen Bibliotheken oder plattformspezifischen Code
erstellen
2
Tatsächlich macht kraxor einen guten Punkt beim Anpassen des Hintergrunds für verschiedene API-Ebenen. Zum Beispiel hat API 21 einen Ripple-Effekt, der vor 21 nicht unterstützt wird (auch nicht mit AppCompat). Daher möchten Sie den Hintergrund des Elements möglicherweise anders gestalten
Greg Ennis
3
Dies ist eine gute Lösung, da sie in anderen Ansichten wiederverwendet werden kann. <style name="LightThemeSelector" parent="android:Theme.Holo.Light"> <item name="android:background">?android:attr/selectableItemBackground</item> ... </style>
Nach