ViewBinding - Wie bekomme ich eine Bindung für die enthaltenen Layouts?
11
Während der Arbeit mit ViewBinding stoße ich auf einige nicht dokumentierte Fälle.
Erstens: Wie erhalte ich eine Bindung für die enthaltenen generischen Ansichtslayoutteile? Die Hauptbindung zeigt nur Elemente im Hauptlayout an.
Zweitens: Wie erhalte ich eine Bindung für enthaltene Layoutteile vom Typ "Zusammenführen"? Auch hier zeigt die Hauptbindung nur Elemente im Hauptlayout.
Bei generischem Layout (nicht Zusammenführungsknoten) müssen wir dem eingeschlossenen Teil eine ID zuweisen. Auf diese Weise haben wir beim Binden Zugriff auf das eingeschlossene Unterteil
private lateinit var exampleBinding:ActivityExampleBinding//activity_example.xml layoutoverride fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
exampleBinding =ActivityExampleBinding.inflate(layoutInflater)
setContentView(exampleBinding.root)//we will be able to access included layouts view like this
val includedView:View= exampleBinding.yourId.idOfIncludedView//[...]}
Mit Zusammenführungsblock in externes Layout aufnehmen. Wir können keine ID hinzufügen, da der Zusammenführungsblock keine Ansicht ist. Nehmen wir an, wir haben ein solches ewiges Zusammenführungslayout (merge_layout.xm):
Um ein solches Zusammenführungslayout richtig zu binden, müssen wir:
In Ihrem Aktivitätscode:
private lateinit var exampleBinding:ActivityExampleBinding//activity_example.xml layoutprivate lateinit var mergeBinding:MergeLayoutBinding//merge_layout.xml layoutoverride fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
exampleBinding =ActivityExampleBinding.inflate(layoutInflater)//we need to bind the root layout with our binder for external layout
mergeBinding =MergeLayoutBinding.bind(exampleBinding.root)
setContentView(exampleBinding.root)//we will be able to access included in merge layout views like this
val mergedView:View= mergeBinding.someView//[...]}
Sehr einfache Antwort und verwendet die neue Syntax - alles funktioniert für mich in einer Nicht-Fragment-Aktivität mit ähnlicher Syntax in onCreate(). Vielen Dank. (Ich habe nur ein bisschen Probleme mit a DrawerLayout)
Fat Monk
0
Der andere einfache Weg wäre die Verwendung der Datenbindungsbibliothek. Umschließen Sie dann Ihr XML-Layout mit einem Tag, sodass bei Verwendung der Bibliothek automatisch die Klassen generiert werden, die zum Binden der Ansichten im Layout mit Ihren Datenobjekten erforderlich sind. Ehrlich gesagt denke ich, dass es der richtige Weg ist. Folgen Sie der Anleitung hier
Ihre erste Frage, die mit ViewBinding mit einem enthaltenen Layout funktioniert, kann so einfach gelöst werden.
Hier ist ein Beispiel main_fragment.xml Datei
Und MainFragment.java kann so sein
Jetzt haben Sie zwei Bindungen. Eine davon ist die Standardeinstellung und die nächste stammt aus dem enthaltenen Layout.
quelle
onCreate()
. Vielen Dank. (Ich habe nur ein bisschen Probleme mit aDrawerLayout
)Der andere einfache Weg wäre die Verwendung der Datenbindungsbibliothek. Umschließen Sie dann Ihr XML-Layout mit einem Tag, sodass bei Verwendung der Bibliothek automatisch die Klassen generiert werden, die zum Binden der Ansichten im Layout mit Ihren Datenobjekten erforderlich sind. Ehrlich gesagt denke ich, dass es der richtige Weg ist. Folgen Sie der Anleitung hier
quelle