Android incluye diseño dinámico con la biblioteca de enlace de datos
Estoy utilizando el marco de MVVM para la aplicación de Android con la biblioteca de enlace de datos.
Tengo algunos compresores reutilizables, que deberían tener todas las actividades. Barra de herramientas, menú, botón de acción flotante.
- Arquitectura de la aplicación de Android - MVVM o MVC?
- RoboBinding vs Android vinculante para MVVM
- Enlaces de datos y animación de Android
- Práctica recomendada para Android MVVM startActivity
- AndroidViewModel vs ViewModel
Quiero crear una actividad genérica, que implementará todas estas características reutilizables y luego cada clase de actividad será heredada de esta actividad genérica. También tengo GenericViewModel clase y todos los demás ViewModel se hereda de esta clase genérica.
Pero tengo un problema con el diseño. Quiero crear un archivo de diseño genérico e incluir allí sublayout dinamically. Fe
<?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" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="data" type="com.mypackage.genericViewModel" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include bind:data="@{data}" layout="@layout/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" /> <include layout="@{Here i want to have dynamic variable}" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout></layout>
No quiero copiar / pegar este código para cada actividad, pero la biblioteca de enlace de datos no permite incluir el diseño dinámicamente. ¿Hay alguna solución para estos casos?
- Cómo configurar el error en EditText utilizando DataBinding MVMF de Framwork
- MVVM: Cómo Concat la cadena en clase de modelo?
- Android: ¿debería un adaptador listView ser parte de tu clase ViewModel?
- Android adaptador de actualización de trabajo después del dispositivo de rotación de nuevo
- ¿Cómo utilizar el patrón MVVM de Android con fragmentos?
- Xamarin Forms Navegación de página MasterDetail causando un accidente en android , Funciona en iOS y UWP
- Ejemplos de patrones de diseño de Android MVVM
- ¿Cómo implemento eficazmente el patrón de diseño de MVVM para mi aplicación de Android, que también facilitará la escritura de casos de prueba?
Aquí está mi solución, espero que le ayude, no pienso que es una buena manera. ¡Si usted encuentra una mejor manera, por favor dígame. Gracias!
Aunque la biblioteca de enlace de datos no permite incluir el diseño dinámicamente, podemos usar ViewModel diferente para el diseño diferente. Utilicé un LinearLayout como un contenedor para alojar el diseño dinámico, y luego anular el método Activity setContentView para agregar vista a mi contenedor (LinearLayout).
GenericActivity
protected GenericViewBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this, R.layout.generic_view); } @Override public void setContentView(View view) { LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mBinding.container.addView(view,lp); }
Layout generic_view
<data> <variable name="genericViewModel" type=".viewModel.GenericViewModel"/> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"> <!--a custom view,some generic layout --> <.view.base.BaseTitleView android:id="@+id/base_title" android:layout_width="match_parent" android:layout_height="wrap_content"/> <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/base_title" android:orientation="vertical"> </LinearLayout> </RelativeLayout>
En actividad concreta lo usas así:
ConcreteActivity
//different layout use different ViewModel here,generic logic&layout is in GenericActivity&generic_view layout. private ActivityConcreteBinding mActivityConcreteBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivityConcreteBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity_concrete,null,false); setContentView(mActivityConcreteBinding.getRoot()); ConcreteViewModel concreteViewModel = new ConcreteViewModel(mBinding);//mBinding from GenericActivity, deliver it into ConcreteViewModel to do some generic logic. ... }
Para mí, no hay necesidad de copiar cola de diseño genérico para cada actividad más.
- La aplicación de Android se bloquea después de integrar React Native con NoClassDefFoundError: com.facebook.react.bridge.JSPackagerWebSocketClient
- Android – Detectar el teclado visible?