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.