2017-07-04 5 views
1

Ich möchte ein einfaches Layout einfügen und eine statische Variable an sie übergeben (String-Ressource hier). I followedmultipleexamples ohne Glück.Variable an inkludiertes Layout über XML übergeben

main_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <data></data> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <include android:id="@+id/first_included" layout="@layout/included" app:theValue="@string/firstValue" /> 
     <include android:id="@+id/first_included" layout="@layout/included" app:theValue="@string/secondValue" /> 
    </LinearLayout> 
</layout> 

included.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 
    <data> 
     <variable name="theValue" type="String" /> 
    </data> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@{theValue}"/>  
</layout> 

Das gibt mir die Compiler-Fehler

Error: No resource identifier found for attribute 'theValue' in package 'com.just.example'

ich tun Datenbindung in dem Rest des Projekts und alles funktioniert fein. Ich könnte den Wert programmgesteuert setzen, aber dieser ist statisch, ich möchte es in der Layout-Datei setzen können.

+0

Verwenden Sie einen Datenbindungsausdruck für 'app: theValue' (z. B.' app: theValue = "@ {@ string/firstValue}" '). – CommonsWare

+0

Ich habe versucht, dies früher zu tun, aber gescheitert, das Problem ist, dass ich meine Ressourcen dot-getrennt haben, die einen Kompilierungsfehler mit Ihrem Vorschlag wirft .. Vielleicht dot-separated Ressourcen sind nicht so gut unterstützt. Danke, es funktionierte so ohne eine dot-getrennte Ressource. Doh .. – Odys

+0

Bitte überprüfen Sie diesen Code: DataBindingUtil.setContentView (this, yourView); in deiner Aktivität. Ich denke du hast es verpasst. Vielen Dank! –

Antwort

1

Im Allgemeinen müssen Sie dem Attribut, mit dem Sie es verwenden möchten, eine Datenbindungsanweisung zuweisen. Wenn das Attribut selbst von den Standard-XML-Definitionen unterstützt wird, wird es nicht fehlschlagen. Wenn es jedoch keine Definition für das Attribut gibt (außer den expliziten und impliziten mit Datenbindung), kann das Attribut nicht verarbeitet werden und Sie werden den Fehler finden, den Sie erhalten haben.

Also, wenn Sie die Datenbindung spezifische Attribute wie mit den Variablen einer inkludierten Layout verwenden, müssen Sie es als

app:myAttr="@{...}" 

Die Expression Language sich ein paar schöne Abkürzungen für definierte Ressourcen definieren. Also in Ihrem Fall können Sie nur @string/firstValue in Ihrem Ausdruck. Dies wird in eine String aufgelöst, die wiederum der Variablen theValue in Ihrem Unterlayout zugeordnet ist.

Verwandte Themen