Cómo utilizar la vinculación de datos con Fragment
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 datos-biding a un fragmento, no una actividad.
- Reemplazar un fragmento a otro fragmento en el TabHost
- GetChildFragmentManager () en Fragmentos programáticamente (dinámicamente) agregados?
- Fragmento en la ronda Desgaste reloj girando en negro en el emulador / reloj
- Ocultar pestañas en el visor
- Trabajando con DIalogs en fragmentos
El error que estoy obteniendo actualmente al compilar es
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
para 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 el fragmento se ve 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 se supone que está enlazado con – de ahí el error. ¿Alguna sugerencia?
- Implementación de pestañas de barras de acción con fragmentos
- Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
- Barra de herramientas de Android que no llama a onOptionsItemSelected de fragmentos en Backstack
- Llamar a startIntentSenderForResult de Fragment (sin usar la actividad existente) (Android Billing v3)
- FragmentManager: moveToState: Estado de fragmento para GridFragment {...} no actualizado en línea; Estado esperado 1 encontrado 0
- Android: Pasar datos de fragmento hijo a fragmento padre
- Cómo obtener objeto de aplicación en la clase de fragmento
- Google Analytics v4: los datos no aparecen en el panel de control
La implementación de vinculación de datos debe estar en el método onCreateView del fragmento, eliminar cualquier enlace de datos existente en su método OnCreate, su onCreateView debería tener el siguiente aspecto:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { MartianDataBinding binding = DataBindingUtil.inflate( inflater, R.layout.martian_data, container, false); View view = binding.getRoot(); //here data must be an instance of the class MarsDataProvider binding.setMarsdata(data); return view; }
Realmente se le anima a utilizar el método de inflate
de su vinculación generada y no el DataBindingUtil:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MainFragmentBinding binding = MainFragmentBinding.inflate(inflater, container, false); //set variables in Binding return binding.getRoot(); }
Docs para DataBindingUtil.inflate () :
Utilice esta versión sólo si layoutId se desconoce de antemano. De lo contrario, utilice el método de inflación de Binding generado para garantizar la inflación de tipo seguro.
Uno puede simplemente recuperar el objeto de vista como se menciona a continuación
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = DataBindingUtil.inflate(inflater, R.layout.layout_file, container, false).getRoot(); return view; }
Trabajando en mi código.
private FragmentSampleBinding dataBiding; private SampleListAdapter mAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); dataBiding = DataBindingUtil.inflate(inflater, R.layout.fragment_sample, null, false); return mView = dataBiding.getRoot(); }
Prueba esto en DataBinding de Android
FragmentMainBinding binding; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false); View rootView = binding.getRoot(); initInstances(savedInstanceState); return rootView; }
- ¿Cómo guardar el estado durante el cambio de orientación en Android si el estado se hace de mis clases?
- Cualquier herramienta / sitio web colaborativo para localizar una aplicación de Android?