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?


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>

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"/>

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á.


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ê.


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>

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.



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.


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"/>

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"
    ... />

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

1

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


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.


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?


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.