java - para - que significa alt en una imagen
Enlace de datos de Android con la etiqueta de inclusiĆ³n (4)
Ejemplo completo fácil
Simplemente configure la
id
en el diseño incluido, y usebinding.includedLayout.anyView
.
Este ejemplo ayuda a pasar un valor a
<include
y acceder a las vistas incluidas en el código.
Paso 1
Tiene
layout_common.xml
, desea pasar
String
al diseño incluido.
TextView
variable de
String
en el diseño y referirá esta
String
a
TextView
.
<data>
// declare fields
<variable
name="passedText"
type="String"/>
</data>
<TextView
android:id="@+id/textView"
...
android:text="@{passedText}"/> //set field to your view.
Paso 2
Incluya este diseño en el diseño principal.
Dé una
id
al diseño incluido, para que podamos usar eso en la clase de enlace.
Ahora puede pasar String
passedText
a su etiqueta
<include
.
activity_main.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">
<LinearLayout
..
>
<include
android:id="@+id/includedLayout"
layout="@layout/layout_common"
app:passedText="@{@string/app_name}" // here we pass any String
/>
</LinearLayout>
</layout>
-
Puede usar ahora
binding.includedLayout.textView
en su clase. -
Puede pasar cualquier variable al diseño incluido como se indicó anteriormente.
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.includedLayout.textView.setText("text");
Nota
Ambos diseños (principal e incluido) deben ser
binding layout
, envueltos con
<layout
Nota de actualización:
El ejemplo anterior funciona correctamente , porque la versión 1.0-rc4 solucionó el problema de necesitar la variable innecesaria.
Pregunta original
Hago exactamente como se describe en la documentation y no funciona:
main.xml:
<layout xmlns:andr...
<data>
</data>
<include layout="@layout/buttons"></include>
....
buttons.xml:
<layout xmlns:andr...>
<data>
</data>
<Button
android:id="@+id/button"
...." />
MyActivity.java:
... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol ''button''
¿Cómo obtener el botón?
El problema es que el diseño incluido no se considera un diseño vinculado a datos. Para hacerlo actuar como uno, debe pasar una variable:
buttons.xml:
<layout xmlns:andr...>
<data>
<variable name="foo" type="int"/>
</data>
<Button
android:id="@+id/button"
...." />
main.xml:
<layout xmlns:andr...
...
<include layout="@layout/buttons"
android:id="@+id/buttons"
app:foo="@{1}"/>
....
Luego puede acceder a los botones indirectamente a través del campo de botones:
MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button
A partir de 1.0-rc4 (recién lanzado), ya no necesita la variable. Puedes simplificarlo a:
buttons.xml:
<layout xmlns:andr...>
<Button
android:id="@+id/button"
...." />
main.xml:
<layout xmlns:andr...
...
<include layout="@layout/buttons"
android:id="@+id/buttons"/>
....
Otra cosa interesante sobre esto es que puede pasar variables al diseño importado desde la carpeta de esta manera:
MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)
Puede hacer que su enlace funcione en su inclusión simplemente agregando una ID de esta manera:
<include
android:id="@+id/loading"
layout="@layout/loading_layout"
bind:booleanVisibility="@{viewModel.showLoading}" />