2016-04-27 11 views
5

Ich habe eine fast einfache Idee: Ich möchte einen Adapter für einen Spinner mit der Datenbindungs-API und einem BindingAdapter generieren. Hier ist der XML ich verwenden möchte:Mit einem BindingAdapter mit einem String-Array aus den Ressourcen

<Spinner 
    android:id="@+id/country" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:value="@{address.country}" 
    app:data="@{@array/countries}" 
    app:keys="@{@array/iso_3166_2}"/> 

Adresse hier ist eine einfache Klasse, die ein Feld mit dem Namen hat country, die ein String ist und wird eine ISO-3166-2 String enthalten. Um es einfach zu halten, sind die Werte "DE" oder "US".

Das hier ist meine vereinfachte arrays.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="iso_3166_2"> 
     <item>DE</item> 
     <item>US</item> 
    </string-array> 

    <string-array name="countries"> 
     <item>@string/country_DE</item> 
     <item>@string/country_US</item> 
    </string-array> 
</resources> 

Für die Bindung ich dieses BindingAdapter schrieb:

@BindingAdapter({"value", "data", "keys"}) 
public static void generateAdapter(Spinner spinner, 
            String value, 
            @ArrayRes int data, 
            @ArrayRes int keys) { 

} 

Wenn ich versuche, den Code ich diesen Fehler zu kompilieren:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Identifiers must have user defined types from the XML file. countries is missing it
file:path/to/the/spinner-above.xml
loc:95:31 - 95:39
****\ data binding error ****

Zeile 95 meiner Xml ist diese Zeile: app:value="@{address.country}"

Siehst du, was ich falsch mache?

Übrigens bin ich nicht sicher über die Anmerkungen in Bezug auf die Array-Ressourcen ist das richtig? Ich finde es nicht möglich, es auf ein String-Array zu beschränken.

Antwort

5

können Sie es erhalten, indem Sie stringArray anstelle von array beziehen. Hier ist, was ich mit RecyclerView getan habe, um Wert von Ressourcen zu erhalten, und es funktioniert perfekt, es könnte Ihnen auch helfen.

in string.xml

<string-array name="myItems"> 
    <item>Item 1</item> 
    <item>Item 2</item> 
    <item>Item 3</item> 
    <item>Item 4</item> 
    <item>Item 5</item> 
    <item>Item 6</item> 
</string-array> 

in layout.xml

app:entries="@{@stringArray/fi}" 

in Ihrem Fall kann es app:data="@{@stringArray/countries}" oder app:keys="@{@stringArray/iso_3166_2}" sein.

und in Bindungsverfahren

@BindingAdapter({"entries"}) 
public static void entries(RecyclerView recyclerView, String[] array) { 
    //get all values in array[] variable. 
} 

beziehen this für mehr.

+1

Interessant Ich werde es überprüfen. Ja! es funktioniert :-D – rekire

Verwandte Themen