error custom coordinatorlayout coordinator android android-coordinatorlayout android-snackbar coordinator-layout snackbar

android - custom - ¿Es una buena práctica envolver todos los diseños en CoordinatorLayout?



custom snackbar android (3)

Estas son las opciones que tienes. Usa uno de estos como necesites en el proyecto.

La mejor manera

La mejor manera de hacer esto es lo que ya dijo en su pregunta, agregue una BaseActivity y extienda todas sus actividades. Según la documentación oficial de CoordinatorLayout ,

CoordinatorLayout está destinado a dos casos de uso principales:

  1. Como una decoración de aplicación de alto nivel o diseño cromado.
  2. Como contenedor para una interacción específica con una o más vistas secundarias.

Entonces, CoordinatorLayout se crea principalmente por esta razón (aunque también hay other razones). Habrá los menores problemas de rendimiento como se menciona en la documentación.

Utilizando FrameLayout

Como ya respondió Rainmaker, puede usar una Actividad con una referencia al diseño de CoordinatorLayout en su carpeta de diseños donde el niño será un framelayout.

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout android:id="@+id/activity_root" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.design.widget.CoordinatorLayout>

Entonces solo setContentView(R.layout.root_coordinate_layout) una actividad con setContentView(R.layout.root_coordinate_layout) . Luego convertirás todas las demás actividades en fragmentos y las agregarás con:

MyFragment myf = new MyFragment(); FragmentTransaction transaction = getFragmentManager() .beginTransaction() .add(R.id.your_layout, myf) .commit();

El camino programático.

Esta es otra forma de hacer lo mismo. Pero esto es un poco más complejo y necesita mucho trabajo por hacer.

En toda su actividad, en lugar de setContentView(R.id.your_layout) , use esto:

LayoutInflater inflater = LayoutInflater.from(this); ConstraintLayout yourLayout = (ConstraintLayout) inflater.inflate(R.layout.your_layout, null, false); CoordinatorLayout layout = new CoordinatorLayout(this); // Set its property as you wish ... layout.addView(mainScreen); setContentView(layout);

Estoy pensando en una forma de implementar Android Snackbars en mi aplicación. Básicamente, quiero poder mostrar Snackbar desde cualquier lugar de la aplicación.

Como descubrí, android.support.design.widget.Snackbar funciona mejor cuando se coloca en android.support.design.widget.CoordinatorLayout . De lo contrario, no puedo deslizarlo, se muestra sobre el cajón de navegación y no interactúa con el botón de acción flotante.

Entonces, la pregunta es: ¿es una buena práctica envolver TODOS mis diseños en CoordinatorLayout , obtener la referencia para él en una BaseActivity, para que pueda pasarse a Snackbar desde casi cualquier lugar?

Esa parece ser una forma sólida de asegurar que el Snackbar y otros componentes del diseño se comporten correctamente, pero ... bueno, significa tocar todos los diseños y tener una BaseActivity que se extienda por todas las demás Actividades y que se pueda acceder desde cualquier Fragmento que desee mostrar. un Snackbar.

¿Hay alguna manera mejor?


He implementado lo mismo como abrir Snackbar desde cualquier lugar en la aplicación.

He creado un método común y simplemente paso el mensaje de contexto y cadena que necesito mostrar y no hay necesidad de pasar ninguna vista. Echa un vistazo a mi fragmento de código.

public static void showSnackBar(Activity context, String msg) { Snackbar.make(context.getWindow().getDecorView().findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG).show(); }

Usando esto, tendrás tu Snackbar en el fondo cada vez.


Sí, puede envolver su diseño en un diseño de coordinador, como

<android.support.design.widget.CoordinatorLayout 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" android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> </android.support.design.widget.AppBarLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingLeft="20dp" android:paddingRight="20dp" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <Button android:id="@+id/btnSimpleSnackbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="Simple Snackbar" /> <Button android:id="@+id/btnActionCallback" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="With Action Callback" /> <Button android:id="@+id/btnCustomSnackbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Custom Color" /> </LinearLayout> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="16dp" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout>