El botón de acción flotante aparece sobre el cajón de navegación

Así que estoy usando https://github.com/neokree/MaterialNavigationDrawer para mi cajón de navegación y https://gist.github.com/Jogan/9def6110edf3247825c9 como mi implementación FAB. Cuando abro el cajón de navegación, no cubre el FAB, y el botón aparece encima de él. Me gustaría evitar ocultar el botón y mostrarlo en el cajón abierto / cerrar como que es bastante distracción. ¿Alguna idea sobre cómo solucionar este problema?

Edit: Estoy agregando la FAB mediante programación haciendo lo siguiente:

fabButton = new FloatingActionButton.Builder(this) .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) .withButtonColor(0xFF2196F3) .withGravity(Gravity.BOTTOM | Gravity.END) .withMargins(0, 0, 16, 16) .create(); 

Cambiar esa declaración al fragmento no lo arregla. La implementación de la barra de navegación que he vinculado anteriormente requiere que la actividad se extienda desde una clase MaterialNavigationDrawer, que puede dibujar el Nav Drawer primero, dejando que el botón sea siempre el último. ¿Hay alguna manera de forzar programaticamente el orden de los elementos?

4 Solutions collect form web for “El botón de acción flotante aparece sobre el cajón de navegación”

Aparece FAB cuando el cajón de navegación está abierto porque esta implementación FAB agrega FAB a la vista de contenido ( android.R.id.content ). Dependiendo de la implementación del cajón de navegación, parecen estar en el mismo nivel en la jerarquía de vistas.

Si no desea cambiar a la implementación FAB diferente. Use onDrawerSlide(View drawerView, float offset) y cambie FAB alfa al abrir el cajón. También puede cambiar su visibilidad dentro de onDrawerClose() o onDrawerOpen() también.

Editar:

 @Override public void onDrawerSlide(View drawerView, float offset){ fabButton.setAlpha(offset); } 

He encontrado una solución ordenada que no implica alfa en ella o cambiar el botón cuando el cajón está abierto o cerrado (lo que hace que se vea como un retraso). Programáticamente, puede modificar el margen final del botón para que salga de la ventana de la actividad mientras cambia el desplazamiento del cajón.

En primer lugar, fuera del método onDrawerSlide , debe obtener los parámetros de diseño de la FAB con el siguiente código (dependiendo del diseño del botón, en mi caso, es FrameLayout ):

 final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams(); 

Comprender que estoy haciendo esto basado en una simple ecuación matemática lineal: y = mx + n, mientras que 'y' es el margen, 'm' es la pendiente (se puede modificar), 'x' es el slideOffset y ' N 'es el margen por defecto / original (16dp). De esta manera se asigna el margen por defecto y la pendiente a las variables como píxeles respetando la abundancia de densidades de visualización:

 int density = (int) Resources.getSystem().getDisplayMetrics().density; final int defaultMargin = 16 * density; final int slope = -100 * density; 

Luego, dentro de onDrawerSlide , haga lo siguiente:

 params.setMarginEnd((int) (slope * slideOffset + defaultMargin)); fab.setLayoutParams(params); 

Si esto no funciona para usted, trate de establecer el marginEnd del botón al construirlo, o establecer los márgenes de los parámetros del diseño como este (aunque tendría que comprobar si marginEnd es a la derecha oa la izquierda):

 params.setMargins(int left, int top, int right, int bottom); 

Espero que esto ayude. Esta es mi primera respuesta, así que espero que no tengas muchas quejas sobre ello.

Esta es una solución alternativa que funciona para mí. Suponga que desea agregar FAB en yourlayout.xml. Ahora crea un framelayout en yourlayout.xml

  <FrameLayout android:id="@+id/myframelayout" android:layout_width="match_parent" android:layout_height="match_parent"> 

Ahora en FloatingActionButton.java reemplazar el método

 public FloatingActionButton create() { ... ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content); root.addView(button, params); return button; } 

con

  public FloatingActionButton create(FrameLayout framelayout) { ... framelayout.addView(button, params); return button; } 

Ahora cambia la declaración FAB como esta.

 FrameLayout yourframelayout = (FrameLayout)findViewById(R.id.myframelayout); fabButton = new FloatingActionButton.Builder(this) .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) .withButtonColor(0xFF2196F3) .withGravity(Gravity.BOTTOM | Gravity.END) .withMargins(0, 0, 16, 16) .create(yourframelayout); 

¡¡Eso es!!

Estoy actualizando la solución de Nikolas Despotoski :

Así que tienes que deshabilitar / ocultar el fab también después de establecer el alfa por lo que si alguna vez el usuario grifos en el lugar donde fab se muestra, entonces no pasaría nada.

 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { // Visible/Enable the FAB } public void onDrawerOpened(View drawerView) { // Hide/Disable the FAB } @Override public void onDrawerSlide(View drawerView, float slideOffset) { // invert the slideOffset value fab.setAlpha(1-slideOffset); } }; 
  • Android, DrawerLayout + Fragmentos + CollapsingToolbarLayout
  • Android.view.InflateException: Línea # 1 del archivo XML binario: Error al inflar la clase <unknown>
  • Android 5.0 - Animar el AppCompat v7 21 icono de inicio de la hamburguesa a la flecha hacia atrás mediante programación
  • ¿Cómo abrir un nuevo fragmento del cajón de navegación?
  • La mejor manera de implementar un cajón de desplazamiento de navegación
  • NavigationView y ActionBarDrawerToggle
  • ¿Cómo implementar el cajón de navegación androide expandible con subitems?
  • ¿Cómo utilizar el diseño de material de acción barra de navegación de cajón animación de conmutación?
  • Configuración del relleno de la barra de estado en NavigationView en Android
  • ¿Es este un uso correcto de Android Fragments y NavigationDrawer?
  • Icono de hamburguesa no se muestra en el fragmento de cajón de navegación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.