Estoy tratando de seguir el ejemplo de enlace de datos del documento oficial de Google https://developer.android.com/tools/data-binding/guide.html
excepto que estoy tratando de aplicar la oferta de datos a un fragmento, no a una actividad.
el error que obtengo actualmente al compilar es
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
para el fragmento se ve así:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
para el fragmento se ve así:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
y partes de mi archivo de diseño para fragmentos se ven así:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="marsdata"
type="uk.co.darkruby.app.myapp.MarsDataProvider" />
</data>
...
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@{marsdata.martianSols}"
/>
</RelativeLayout>
</layout>
mi sospecha es que MartianDataBinding
no sabe con qué archivo de diseño debe estar vinculado, de ahí el error. ¿Alguna sugerencia?
fuente
View view = binding.getRoot();
He estado atrapado en esto durante tanto tiempo que estoy legítimamente bastante molesto porque no pude encontrar ninguna documentación al respecto en developer.android.com ... Resolvió el problema. ¡Gracias!En realidad, se le recomienda utilizar el
inflate
método de su enlace generado y no el DataBindingUtil:Documentos para DataBindingUtil.inflate () :
fuente
cannot be resolved to a type
error en la compilación. No es confiable en mi opinión. Si voy primero conDataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
y luego lo cambio aFragmentCameraBinding.inflate(inflater, container, false);
, funciona, pero después de reconstruir da el error nuevamente.DataBindingUtil.inflate
MainFragmentBinding
clase. Esa clase se genera a partir del archivo de diseño, por lo que el diseño deseado se aplica automáticamente.Incluso las otras respuestas pueden funcionar bien, pero quiero decir el mejor enfoque.
Use
Binding class's inflate
como se recomienda en la documentación de Android .Una opción es inflar por
DataBindingUtil
pero cuando solo usted no sabe haber generado una clase de enlace .--Has generado automáticamente
binding class
, usa esa clase en lugar de usarDataBindingUtil
.En java
En kotlin
En la documentación de la clase DataBindingUtil puede ver.
Si su clase de agrupación de diseño no se genera @Vea esta respuesta .
fuente
inflate
método que toma elLayoutInflater
como su único argumento?ViewGroup container
?container
es necesario cuandoattachToRoot
estátrue
.Si está utilizando ViewModel y LiveData Esta es la sintaxis suficiente
Sintaxis de Kotlin:
fuente
Prueba esto en Android DataBinding
fuente
Uno simplemente puede recuperar el objeto de vista como se menciona a continuación
fuente
Sintaxis de Kotlin:
fuente
Como la mayoría ha dicho, pero no se olvide de configurar LifeCycleOwner
Sample en Java, es decir
fuente
trabajando en mi código
fuente
Un ejemplo completo en fragmentos de enlace de datos
FragmentMyProgramsBinding es una clase de enlace generada para res / layout / fragment_my_programs
fuente
Blog muy útil sobre enlace de datos: https://link.medium.com/HQY2VizKO1
Declara un enlace val como este en Fragment:
No olvides escribir esto en fragmentos
fuente
Otro ejemplo en Kotlin:
Tenga en cuenta que el nombre "MartianDataBinding" depende del nombre del archivo de diseño. Si el archivo se llama "martian_data", el nombre correcto sería MartianDataBinding.
fuente
Todos dicen acerca de
inflate()
, pero ¿qué pasa si queremos usarloonViewCreated()
?Puede usar el
bind(view)
método de la clase de enlace concreto para obtener unaViewDataBinding
instancia paraview
.Por lo general, escribimos BaseFragment de esta manera (simplificado):
Y úsalo en un fragmento infantil.
Si todos los Fragmentos usan enlace de datos, incluso puede simplificarlo usando el parámetro tipo.
No sé si está bien afirmar que no es nulo allí, pero ... entiendes la idea. Si quieres que sea anulable, puedes hacerlo.
fuente