2016-04-27 14 views
5

Mam prosty pomysł: chcę wygenerować adapter dla spinnera z API powiązania danych i BindingAdapter. Oto XML chcę użyć:Używanie BindingAdapter z tablicą ciągów z zasobów

<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}"/> 

Adres tutaj jest prosta klasa, która ma pole o nazwie country który jest ciągiem znaków i zawierać ISO-3166-2 String. Dla uproszczenia wartości będą miały wartość "DE" lub "US".

To tutaj jest mój uproszczony 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> 

za wiązanie Napisałem ten BindingAdapter:

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

} 

Kiedy próbuję skompilować kod otrzymuję ten błąd:

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

Linia 95 mojego xml to linia: app:value="@{address.country}"

Czy widzisz, co robię źle?

Nawiasem mówiąc, nie jestem pewien co do adnotacji związanych z zasobami tablicy, czy to prawda? Nie znajduję sposób, aby ograniczyć go do tablicy ciągów.

Odpowiedz

5

można go uzyskać, podając stringArray zamiast array. Oto, co zrobiłem z recyclerView, aby uzyskać wartość z zasobów i działa idealnie, może ci również pomóc.

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

w layout.xml

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

w Twoim przypadku może to być app:data="@{@stringArray/countries}" lub app:keys="@{@stringArray/iso_3166_2}".

w metodzie wiązania

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

patrz this więcej.

+1

Interesujące, sprawdzę to. Tak! działa :-D – rekire

Powiązane problemy