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:
- Como una decoración de aplicación de alto nivel o diseño cromado.
- 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>