Como remover o preenchimento de botões no Android?

184

No meu aplicativo para Android, tenho este layout:

<?xml version="1.0" encoding="utf-8" ?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical">

    <fragment
         android:id="@+id/map"
         android:layout_width="match_parent"
         android:layout_height="0dp" 
         android:layout_weight="1" 
         class="com.google.android.gms.maps.SupportMapFragment"/>

    <Button
        android:id="@+id/button_back"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="CloseActivity"
        android:padding="0dp"
        android:text="@+string/back" />

</LinearLayout>

Na visualização e no telefone, parece com:

Como você pode ver no botão na área inferior, há algum preenchimento lá.

Como posso me livrar disso e deixar o botão preencher completamente a área inferior?

ómega
fonte
6
A resposta do DATerre está correta há dois anos. Você pode marcar assim?
precisa saber é o seguinte
1
Esta pergunta requer edição para ter um título melhor. Tornou-se o primeiro resultado da Pesquisa do Google, embora não responda realmente à pergunta.
SOFe 29/07

Respostas:

436

Para mim, o problema acabou sendo minHeight e minWidth em alguns dos temas do Android.

No elemento Button, adicione:

<Button android:minHeight="0dp" android:minWidth="0dp" ...

Ou no estilo do seu botão:

<item name="android:minHeight">0dp</item>
<item name="android:minWidth">0dp</item>
DA Terre
fonte
5
Demorei um pouco até eu perceber que não estava lidando com um comportamento estranho de preenchimento, mas sim com uma altura mínima.
Pijusn
7
Eu não acho que essa resposta realmente responda à pergunta original. Mas ainda estou feliz por me deparar com isso, porque não conseguia descobrir por que Buttonainda estava ocupando tanto espaço, mesmo depois de configurá-lo android:background="@null". O fato de que o Buttonestilo padrão do responsável é responsável é uma dica muito boa.
Tony Chan
É importante usar o android: minHeight = "0dp" android: minWidth = "0dp" e não apenas um deles.
Ricardo
Isso remove o efeito de canto arredondado e ondulação do botão no Android Nougat, alguma idéia do que poderia estar causando esse comportamento?
rraallvv
Esta resposta resolveu um problema com um GridLayout contendo botões com opções de autoSize no texto que fica furioso enquanto eu tentava obter mais botões para caber em linhas / colunas. Resposta simples que me levou muito tempo para encontrar ...
Mike Hanafey
71

Minha solução foi definida como 0 nas propriedades insetTop e insetBottom.

<android.support.design.button.MaterialButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:insetTop="0dp"
        android:insetBottom="0dp"
        android:text="@string/view_video"
        android:textColor="@color/white"/>
sochas
fonte
1
Foi isso que resolveu o problema para mim também! Obrigado!
SPM
46

Isso não é preenchimento, é a sombra ao redor do botão em seu plano de fundo desenhável. Crie seu próprio plano de fundo e ele desaparecerá.

Delyan
fonte
6
Eu fiz. não desapareceu.
Hasan
Como seu tamanho pode ser medido?
Iman Akbari
É isso, @Behr, mudando o fundo para a cor do botão
Ramon
Eu só percebi que a minha imagem de fundo tem estofo transparente
Fruit
22

Uma solução alternativa pode ser tentar usar -vevalores para margens como a seguir:

<Button
    android:id="@+id/button_back"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="CloseActivity"
    android:padding="0dp"
    android:layout_marginLeft="-5dip"
    android:layout_marginRight="-5dip"
    android:layout_marginTop="-5dip"
    android:layout_marginBottom="-5dip"
    android:text="@string/back" />

Isso fará com que esse espaço desapareça. Quero dizer, você pode escolher o dipvalor apropriado , o que faz com que ele desapareça. Funcionou para mim. Espero que funcione para você.

Shobhit Puri
fonte
4
Eu seria cuidadoso ao usar esta solução. O que ele faz é apenas ocultar o fundo do botão (borda + sombras) usando margens negativas. O que é mudanças de estilo e borda + sombra leva mais que 5dp? Prefiro usar a solução Delyan / Casey Murray para estar no lado seguro.
lenrok258
Além disso, margens negativas não são oficialmente suportados em Android por isso também eu evitar isso
Tim Kist
14

Para remover o preenchimento ao redor do botão de alternância, precisamos definir minWidth e minHeight 0dp.android:minWidth="0dp" android:minHeight="0dp"

  <ToggleButton
        android:id="@+id/toggle_row_notifications"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"
        android:minHeight="0dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/_5sdp"
        android:textOn=""
        android:textOff=""
        android:background="@android:color/transparent"
        android:button="@drawable/toggle_selector"
        />

defina seu arquivo drawable como atributo de botão como: android:button="@drawable/toggle_selector"

Abaixo está o meu toggle_selecter.xmlarquivo

<?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:drawable="@drawable/notifications_toggle_on" 
                  android:state_checked="true"/>
            <item android:drawable="@drawable/notifications_toggle_off" 
                  android:state_checked="false"/>
     </selector>
Yashoda Bane
fonte
9

Eu sou novo no android, mas tive uma situação semelhante. Fiz o que @Delyan sugeriu e também usei android: background = "@ null" no arquivo de layout xml.

Casey Murray
fonte
6

No conjunto XML do botão android:includeFontPadding="false"

user1005462
fonte
6

Eu tive o mesmo problema e parece que é por causa da cor de fundo do botão. Tente alterar a cor de fundo para outra cor, por exemplo:

android:background="@color/colorActive"

e veja se funciona. Você pode definir um estilo se desejar que o botão seja usado.

Panagiotis
fonte
Isso remove o recurso de destaque / animação do botão.
Altus
6

Para remover o preenchimento superior e inferior

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"//to effect the following parameters, this must be added!
        android:insetTop="0dp"
        android:insetBottom="0dp"/>

Para remover o preenchimento esquerdo e direito

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"//to effect the following parameters, this must be added!
        android:insetLeft="0dp"
        android:insetRight="0dp"/>
Ali Rezaiyan
fonte
4

Não é um preenchimento, mas ou a sombra do plano de fundo desenhável ou um problema com o minHeighteminWidth .

Se você ainda deseja que o bom efeito cascata afete, crie seu próprio estilo de botão usando o ?attr/selectableItemBackground:

<style name="Widget.AppTheme.MyCustomButton" parent="Widget.AppCompat.Button.Borderless">
    <item name="android:minHeight">0dp</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:layout_height">48dp</item>
    <item name="android:background">?attr/selectableItemBackground</item>
</style>

E aplique no botão:

<Button 
    style="@style/Widget.AppTheme.MyCustomButton"
    ... />
Allan Veloso
fonte
2

Não parece preenchimento, margem ou altura / largura. A configuração android:background="@null"do botão perde a animação por toque, mas a configuração do plano de fundo para qualquer coisa corrige essa borda.


Atualmente, estou trabalhando com:

minSdkVersion 19
targetSdkVersion 23
juil
fonte
1

Dê ao seu botão um plano de fundo personalizado: @ drawable / material_btn_blue

Mike6679
fonte
0

Você também pode fazer isso com layout_width(height)parâmetros.

Por exemplo, eu apaguei o espaço superior e inferior com o android:layout_height="18dp"código.

Max Zonov
fonte
0

Um botão padrão não deve ser usado com largura total e é por isso que você experimenta isso.

fundo

Se você der uma olhada no Design de materiais - Estilo dos botões , verá que um botão tem uma área de clique em altura de 48dp, mas será exibido como 36dp de altura por ... por algum motivo.

Este é o contorno do plano de fundo que você vê, que não cobre toda a área do botão.
Possui cantos arredondados e algum preenchimento e deve ser clicável por si só, agrupar seu conteúdo e não abranger toda a largura na parte inferior da tela.

Solução

Como mencionado acima, o que você deseja é um plano de fundo diferente . Não é um botão padrão, mas um plano de fundo para um item selecionável com esse bom efeito cascata.

Para este caso de uso, existe o ?selectableItemBackgroundatributo de tema que você pode usar para seus planos de fundo (especialmente em listas).
Ele adicionará uma ondulação padrão da plataforma (ou alguma lista de estados de cores em <21) e usará as cores do tema atual.

Para seu uso, você pode apenas usar o seguinte:

<Button
    android:id="@+id/sign_in_button"
    style="?android:attr/buttonBarButtonStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Login"
    android:background="?attr/selectableItemBackground" />
                   <!--  /\ that's all -->

Também não há necessidade de adicionar pesos de layout se a sua visualização for a única e se estender por toda a tela

Se você tiver alguma idéia diferente sobre como deve ser o seu plano de fundo, crie um drawable personalizado e gerencie cores e estados.

Esta resposta foi copiada da pergunta: Como remover corretamente o preenchimento (ou margem?) Ao redor dos botões no Android?

Mohammad7G
fonte
0

Depois de horas pesquisando várias respostas, finalmente encontrei uma solução que não usa um elemento diferente, manipula minHeightou minWidth, ou mesmo envolve Buttonum RelativeLayout.

<Button
    android:foreground="?attr/selectableItemBackground"
    android:background="@color/whatever" />

O principal argumento aqui é a definição do primeiro plano em vez do segundo plano, conforme muitas das respostas estipulam. A alteração do plano de fundo em si selectableItemBackgroundsubstituirá as alterações feitas na cor / plano de fundo do botão, se houver.

Alterar o primeiro plano oferece o melhor dos dois mundos: livre-se do preenchimento "invisível" e mantenha o design do botão.

Altus
fonte
0

Você pode usar o estilo sem borda no AppCompatButton como abaixo. e use android: background com ele.

style = "@ style / Widget.AppCompat.Button.Borderless.Colored"

Código do botão

<androidx.appcompat.widget.AppCompatButton
        android:id="@+id/button_visa_next"
        android:background="@color/colorPrimary"
        style="@style/Widget.AppCompat.Button.Borderless.Colored"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/spacing_normal"
        android:text="@string/next"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

Resultado:

insira a descrição da imagem aqui

Shihab Uddin
fonte