Quero ter um botão Android com ícone + texto centralizado dentro dele. Estou usando o atributo drawableLeft para definir a imagem, isso funciona bem se o botão tiver uma largura de, "wrap_content"
mas eu preciso esticar para a largura máxima, então uso a largura "fill_parent"
. Isso move meu ícone diretamente para a esquerda do botão e quero o ícone e o texto centralizados dentro do botão.
Eu tentei configurar o preenchimento, mas isso só permite dar um valor fixo, então não é o que eu preciso. Preciso ter ícone + texto alinhados no centro.
<Button
android:id="@+id/startTelemoteButton"
android:text="@string/start_telemote"
android:drawableLeft="@drawable/start"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:width="fill_parent"
android:heigh="wrap_content" />
Alguma sugestão de como eu poderia conseguir isso?
android
android-layout
user-interface
button
alignment
Jloriente
fonte
fonte
Respostas:
android: drawableLeft está sempre mantendo android: paddingLeft como uma distância da borda esquerda. Quando o botão não está definido como android: width = "wrap_content", ele sempre ficará para a esquerda!
Com o Android 4.0 (API de nível 14), você pode usar o atributo android: drawableStart para colocar um drawable no início do texto. A única solução compatível com versões anteriores que encontrei é usar um ImageSpan para criar um Spannable de Texto + Imagem:
No meu caso, também precisei ajustar o atributo android: gravity do Button para que pareça centralizado:
fonte
button.setText(buttonLabel)
Sei que estou atrasado para responder a esta pergunta, mas isso me ajudou:
Eu encontrei esta solução aqui: dificuldade da interface do usuário do Android: criar um botão com texto e ícone centralizados
fonte
Usei LinearLayout em vez de Button . O OnClickListener , que preciso usar, também funciona bem para LinearLayout.
fonte
Todas as respostas anteriores parecem estar desatualizadas
Você pode usar o
MaterialButton
agora, que permite definir a gravidade do ícone.Para usar os componentes materiais, você obviamente precisará:
Adicionar uma dependência
implementation 'com.google.android.material:material:1.3.0-alpha01'
(usar a versão mais recente)Faça seu tema estender o tema dos Componentes de materiais
Caso você não possa fazer isso, estenda-o do tema Material Bridge
fonte
Eu o ajusto adicionando preenchimento à esquerda e à direita da seguinte maneira:
fonte
Recentemente, encontrei o mesmo problema. Tentei encontrar uma solução mais barata, então pensei nisso.
Em seguida, basta ligar para o
OnClickListener
onLinearLayout
.Espero que isso ajude alguém, pois parece um problema muito comum. :)
fonte
Você pode usar um botão personalizado que mede e desenha a si mesmo para acomodar um drawable esquerdo. Encontre um exemplo e uso aqui
Uso
fonte
Esta é a minha solução que escrevi há 3 anos. O botão tem texto e um ícone à esquerda e está no quadro que é o botão real aqui e pode ser esticado por fill_parent. Não posso testar novamente, mas estava funcionando naquela época. Provavelmente Button não precisa ser usado e pode ser substituído por TextView, mas não vou testá-lo agora e ele não muda muito a funcionalidade aqui.
fonte
Sei que esta pergunta é um pouco mais antiga, mas talvez você ainda esteja aberto para dicas ou soluções alternativas:
Crie um RelativeLayout "wrap_content" com a imagem do botão como plano de fundo ou o próprio botão como o primeiro elemento do layout. Obtenha um LinearLayout e defina-o como "layout_centerInParent" e "wrap_content". Em seguida, defina seu Drawable como uma visualização de imagem. Por fim, defina um TextView com seu texto (local).
então basicamente você tem esta estrutura:
ou assim:
Eu sei que com essa solução há muitos elementos para lidar, mas você pode criar facilmente seu próprio botão personalizado com ela e também definir a posição exata do texto e dos drawables :)
fonte
Minha maneira de resolver isso envolveu cercar o botão com
<View ../>
elementos leves que se redimensionam dinamicamente. Abaixo estão vários exemplos do que pode ser alcançado com isso:Observe que a área clicável dos botões no exemplo 3 é a mesma que no 2 (ou seja, com espaços), que é diferente do exemplo 4, onde não há lacunas "não clicáveis" entre eles.
Código:
fonte
Tente usar esta biblioteca
OmegaCenterIconButton
fonte
Você pode criar um widget personalizado:
A classe Java IButton:
}
O layout ibutton.xml
Para usar este widget personalizado:
Você deve fornecer o namespace para os atributos personalizados xmlns: ibutton = "http://schemas.android.com/apk/res/com.test.android.xxx" onde com.test.android.xxx é o pacote raiz de a aplicação.
Basta colocá-lo abaixo de xmlns: android = "http://schemas.android.com/apk/res/android".
A última coisa de que você vai precisar são os atributos personalizados no attrs.xml.
No attrs.xml
Para um melhor posicionamento, envolva o botão personalizado dentro de um LinearLayout, se quiser evitar possíveis problemas com os posicionamentos RelativeLayout.
Aproveitar!
fonte
Tinha um problema semelhante, mas queria um drawable central sem texto e sem layouts agrupados. A solução foi criar um botão personalizado e adicionar mais um drawable além de LEFT, RIGHT, TOP, BOTTOM. Pode-se modificar facilmente o posicionamento do drawable e colocá-lo na posição desejada em relação ao texto.
CenterDrawableButton.java
attrs.xml
uso
fonte
Coloque o FrameLayout em LinearLayout e defina a orientação como Horizontal.
fonte
Você pode colocar o botão sobre um LinearLayout
fonte
O que acontece se você tentar android: gravity = "center_horizontal"?
fonte
Acho que android: gravity = "center" deve funcionar
fonte
Como sugerido por Rodja, antes do 4.0 não havia uma maneira direta de centralizar o texto com o drawable. E, de fato, definir um valor de padding_left afasta o drawable da borda. Portanto, minha sugestão é que em tempo de execução você calcule exatamente quantos pixels da borda esquerda seu drawable precisa ter e depois passe-o usando setPadding Seu cálculo pode ser algo como
A largura do seu drawable é fixa e você pode consultá-la e também calcular ou adivinhar a largura do texto.
Finalmente, você precisaria multiplicar o valor de preenchimento pela densidade da tela, o que pode ser feito usando DisplayMetrics
fonte
Eu não testei, mas parece que você pode usar a biblioteca CenteredContentButton
fonte
public class DrawableCenterTextView extends TextView {
}
fonte
Correção suja.
Descobrir o preenchimento correto resolverá o propósito. Porém, para telas variadas, use diferentes preenchimentos e coloque esse recurso dimensional na respectiva pasta de valor.
fonte
Use RelativeLayout (container) e android: layout_centerHorizontal = "true" , meu exemplo:
fonte
Outra possibilidade de manter o tema do botão.
Com esta solução, se adicionar @ color / your_color @ color / your_highlight_color no seu tema de atividade, você pode ter o tema Matherial no Lollipop com sombra e ondulação e, para a versão anterior, botão plano com sua cor e cor de destaque ao pressioná-lo.
Além disso, com esta solução, o tamanho automático da imagem
Resultado: Primeiro no dispositivo Lollipop Segundo: No dispositivo pré-pirulito 3: Pressione o botão do dispositivo pré-pirulito
fonte
Tenho centrada
textView
com o ícone usandopaddingLeft
e e alinhando textView a esquerda | centerVertical . e para uma pequena lacuna entre a visualização e o ícone, useidrawablePadding
fonte
android:paddingLeft
funcionou.Este pode ser um tópico antigo / fechado, mas eu procurei em todos os lugares e não encontrei nada útil, até que decidi criar minha própria solução. Se houver alguém aqui tentando procurar uma resposta, experimente esta, você pode economizar um minuto para pensar
Como o layout linear age como o contêiner e aquele que tem o seletor, quando você clica em todo o layout linear, ele fica exatamente como deveria ser. se você quiser que ambos sejam centralizados, use a folha de rosto relativa. Se você quiser centralizado horizontalmente, altere a orientação para horizontal.
Tome nota NÃO se esqueça de adicionar android: clickable = "true" ao seu contêiner principal (relativo ou linear) para que a ação ocorra.
Novamente, este pode ser um tópico antigo, mas ainda pode ajudar alguém nisso.
-cheers espero que ajude- happycodings.
fonte
Se você usar uma das soluções de visualização personalizada , tome cuidado, porque elas geralmente falham em texto longo ou com várias linhas . Reescrevi algumas respostas, substituí
onDraw()
e entendi que era um caminho errado.fonte
Eu vi soluções para alinhar drawable em start / left, mas nada para drawable end / right, então eu vim com essa solução. Ele usa preenchimentos calculados dinamicamente para alinhar drawable e texto nos lados esquerdo e direito.
É importante definir a gravidade em seu layout para "center_vertical | start" ou "center_vertical | end", dependendo de onde você definir o ícone. Por exemplo:
O único problema com essa implementação é que o botão pode ter apenas uma linha de texto, caso contrário, a área do texto preenche o botão e os preenchimentos serão 0.
fonte
usa isto
android:background="@drawable/ic_play_arrow_black_24dp"
basta definir o plano de fundo para o ícone que você deseja centralizar
fonte