Estoy usando el nuevo FloatingActionButton de la biblioteca de diseño de Google y tengo algunos problemas extraños de relleno / margen. Esta imagen (con las opciones de diseño del desarrollador activadas) es de API 22.
Y de API 17.
Este es el XML
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_gravity="bottom|right"
android:layout_marginLeft="16dp"
android:layout_marginRight="20dp"
android:layout_marginTop="-32dp"
android:src="@drawable/ic_action_add"
app:fabSize="normal"
app:elevation="4dp"
app:borderWidth="0dp"
android:layout_below="@+id/header"/>
¿Por qué el FAB en API 17 es mucho más grande en cuanto a relleno / margen?
CoordinatorLayout
para alinearlo verticalmente y observar el relleno adicional pre-piruleta. Puede averiguarlo a partir de las fuentes FAB descompiladas, pero prefiero esperar a que Google lo arregle como lo hizoCardView
.Respuestas:
Actualización (octubre de 2016):
La solución correcta ahora es poner
app:useCompatPadding="true"
en su FloatingActionButton. Esto hará que el relleno sea coherente entre las diferentes versiones de API. Sin embargo, esto todavía parece hacer que los márgenes predeterminados se desvíen un poco, por lo que es posible que deba ajustarlos. Pero al menos no hay más necesidad de estilos específicos de API.Respuesta anterior:
Puede lograr esto fácilmente utilizando estilos específicos de API. En tu normal
values/styles.xml
, pon algo como esto:y luego en values-v21 / styles.xml, use esto:
y aplique el estilo a su FloatingActionButton:
Como han señalado otros, en API <20, el botón genera su propia sombra, que se suma al ancho lógico general de la vista, mientras que en API> = 20 usa los nuevos parámetros de Elevación que no contribuyen al ancho de la vista.
fuente
elevation
que establezca en la FAB.app:useCompatPadding="true"
Se acabaron con
styles.xml
o con.java
archivos. Déjame hacerlo simple.El margen / relleno adicional que vio en el FAB en su segunda imagen se debe a este compatPadding en los dispositivos anteriores a la piruleta . Si esta propiedad no se establece, se aplica en dispositivos anteriores a lollopop y NO en dispositivos lollipop +.
Prueba de concepto
fuente
después de un tiempo buscando y probando la solución, soluciono mi problema agregando esta línea solo a mi diseño xml:
y este es mi diseño de botón flotante completo
fuente
useCompatPadding
nada más obtiene el mismo resultado.Hay un problema dentro de la biblioteca de soporte de diseño. Utilice el método siguiente para solucionar este problema hasta que se actualice la biblioteca. Intente agregar este código a su actividad o fragmento para resolver el problema. Mantenga su xml igual. En piruletas y arriba no hay margen, pero abajo hay un margen de 16dp.
Actualizar ejemplo de trabajo
XML: FAB está dentro de un RelativeLayout
Java
Convertir dp en px
Chupete
Pre Lollipop
fuente
RelativeLayout.LayoutParams
no se puede convertir alLayoutParams
deFloatingActionButton
y no veo márgenes de 16dp en pre Lollipop. El ancho deFloatingActionButton
pre Lollipop es 84dp en lugar de 56dp y su altura es 98dp.View.getLayoutParams
devuelve unLayoutParams
del tipo deView
is - en el caso de Eugene es unRelativeLayout.LayoutParams
.En pre Lollipop
FloatingActionButton
se encarga de dibujar su propia sombra. Por lo tanto, la vista tiene que ser un poco más grande para dejar espacio a la sombra. Para obtener un comportamiento coherente, puede establecer márgenes para tener en cuenta la diferencia de altura y anchura. Actualmente estoy usando la siguiente clase :Actualización: Bibliotecas de soporte de Android v23 renombradas fab_size dimens a:
fuente
La respuesta de Markus funcionó bien para mí después de actualizar a v23.1.0 y hacer algunos ajustes en las importaciones (con el complemento gradle reciente usamos nuestra aplicación R en lugar de la R de la biblioteca de diseño). Aquí está el código para v23.1.0:
fuente
En el archivo de diseño, establezca la elevación del atributo en 0. porque toma la elevación predeterminada.
Ahora, en actividad, verifique el nivel de API mayor que 21 y configure la elevación si es necesario.
fuente