Estou usando o novo FloatingActionButton da Biblioteca de projetos do Google e estou tendo problemas estranhos de preenchimento / margem. Esta imagem (com opções de layout do desenvolvedor ativadas) é da API 22.
E da API 17.
Este é o 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 que o FAB na API 17 é muito maior em termos de preenchimento / margem?
CoordinatorLayout
para alinhá-lo verticalmente e observar o preenchimento extra pré-pirulito. Você poderia descobrir a partir das fontes FAB descompiladas, mas prefiro esperar que o Google conserte como fez paraCardView
.Respostas:
Atualização (outubro de 2016):
A solução correta agora é colocar
app:useCompatPadding="true"
em seu FloatingActionButton. Isso tornará o preenchimento consistente entre as diferentes versões da API. No entanto, isso ainda parece diminuir um pouco as margens padrão, então você pode precisar ajustá-las. Mas pelo menos não há necessidade de estilos específicos de API.Resposta anterior:
Você pode fazer isso facilmente usando estilos específicos de API. Em seu normal
values/styles.xml
, coloque algo assim:e em values-v21 / styles.xml, use isto:
e aplique o estilo ao seu FloatingActionButton:
Como outros notaram, na API <20, o botão renderiza sua própria sombra, o que adiciona à largura lógica geral da visualização, enquanto na API> = 20 ele usa os novos parâmetros de elevação que não contribuem para a largura da visualização.
fonte
elevation
você definir no FAB.app:useCompatPadding="true"
Chega de mexer com
styles.xml
ou com.java
arquivos. Deixe-me simplificar.A margem extra / preenchimento que você viu no FAB em sua segunda foto é devido a este compatPadding em dispositivos pré-pirulito . Se esta propriedade não for definida, ela será aplicada em dispositivos pré-lollopop e NÃO em dispositivos lollipop +.
Prova de conceito
fonte
depois de algum tempo pesquisando e testando a solução, resolvo meu problema ao adicionar esta linha somente ao meu layout xml:
e este é todo o meu layout de botão flutuante
fonte
useCompatPadding
nem qualquer outra coisa obtém o mesmo resultado.Há um problema na Biblioteca de Suporte de Design. Use o método abaixo para corrigir esse problema até que a biblioteca seja atualizada. Tente adicionar este código à sua atividade ou fragmento para resolver o problema. Mantenha o seu xml igual. No pirulito e acima não há margem, mas abaixo há uma margem de 16 dp.
Atualizar Exemplo de Trabalho
XML - FAB está dentro de um RelativeLayout
Java
Converter dp em px
Pirulito
Pré Lollipop
fonte
RelativeLayout.LayoutParams
não pode ser convertido para oLayoutParams
deFloatingActionButton
e não vejo nenhuma margem de 16 dp no pré Lollipop. A largura doFloatingActionButton
pré Lollipop é 84 dp em vez de 56 dp e sua altura é 98 dp.View.getLayoutParams
retorna umLayoutParams
do tipo deView
está in - no caso de Eugene é aRelativeLayout.LayoutParams
.No pré Lollipop
FloatingActionButton
é responsável por desenhar sua própria sombra. Portanto, a visualização deve ser ligeiramente maior para dar espaço para a sombra. Para obter um comportamento consistente, você pode definir as margens para compensar a diferença de altura e largura. Atualmente, estou usando a seguinte classe :Atualização: Bibliotecas de suporte Android v23 renomeado fab_size dimens para:
fonte
A resposta de Markus funcionou bem para mim depois de atualizar para a v23.1.0 e fazer alguns ajustes nas importações (com o plugin gradle recente, usamos nosso aplicativo R em vez do R da biblioteca de design). Aqui está o código da v23.1.0:
fonte
No arquivo de layout, defina a elevação do atributo como 0. porque leva a elevação padrão.
Agora, em atividade, verifique o nível de API maior que 21 e defina a elevação, se necessário.
fonte