Existe uma maneira fácil de adicionar preenchimento entre a caixa de seleção em um controle CheckBox e o texto associado?
Não posso simplesmente adicionar espaços à esquerda, porque meu rótulo é multilinhas.
Como está, o texto está muito perto da caixa de seleção:
TextView
withdrawableLeft
e usedrawablePadding
para dar espaço ao texto. No código, apenas alterne os estados selecionados e não selecionados.Respostas:
Detesto responder à minha própria pergunta, mas neste caso acho que preciso. Depois de conferir, @Falmarri estava no caminho certo com sua resposta. O problema é que o controle CheckBox do Android já usa a propriedade android: paddingLeft para obter o texto onde está.
A linha vermelha mostra o valor de deslocamento paddingLeft de toda a CheckBox
Se eu simplesmente substituir esse preenchimento no meu layout XML, ele estragará o layout. Aqui está o que a configuração paddingLeft = "0" faz:
Acontece que você não pode corrigir isso em XML. Você faz isso no código. Aqui está o meu snippet com um aumento de 10dp no preenchimento codificado.
Isso fornece o seguinte, onde a linha verde é o aumento do preenchimento. Isso é mais seguro do que codificar um valor, uma vez que diferentes dispositivos podem usar diferentes drawables para a caixa de seleção.
ATUALIZAÇÃO - Como as pessoas mencionaram recentemente nas respostas abaixo, esse comportamento aparentemente mudou em Jelly Bean (4.2). Seu aplicativo precisará verificar em qual versão está sendo executado e usar o método apropriado.
Para 4.3+, é simplesmente definir padding_left. Veja a resposta da htafoya para obter detalhes.
fonte
paddingLeft="48sp"
? Funciona bem aqui, mesmo que eu mude de escala e orientação. Seu código me forneceu valores irregulares de preenchimento em uma lista de itens.getView()
adaptador personalizado (se reciclar suas visualizações), pois o preenchimento aumentará infinitamente. Para corrigir esse problema que eu tinha que usar algo como isto:boolean isHackNeeded = Build.VERSION.SDK_INT < 17; float scale = context.getResources().getDisplayMetrics().density; if (isHackNeeded) {CheckBox rb = new CheckBox(context); this.PADDING = rb.getPaddingLeft() + Math.round(10.0f * scale); } else { this.PADDING = Math.round(10.0f * scale); }
. E depois usarPADDING
para cada CheckBox I inflar:check.setPadding(PADDING, check.getPaddingTop() ...
Dada a resposta @DougW, o que faço para gerenciar a versão é mais simples, adiciono à minha exibição da caixa de seleção:
onde o dimen é encontrado em duas pastas de valores:
valores
valores-v17 (4.2 JellyBean)
Eu tenho uma verificação personalizada, use os dps para sua melhor escolha.
fonte
values-v17
como a correção foi introduzida na API 17 (de acordo com alguns posts acima)Use o atributo em
android:drawableLeft
vez deandroid:button
. Para definir o preenchimento entre o drawable e o uso de textoandroid:drawablePadding
. Para posicionar o uso desenhávelandroid:paddingLeft
.fonte
android:background="@android:color/transparent"
e margem esquerda irá desaparecer<item name="android:checkboxStyle">@style/CheckBox</item>
dessa forma, você tem o estilo definido uma vez e referenciado apenas uma vez.O Android 4.2 Jelly Bean (API 17) coloca o texto paddingLeft a partir do botão Drawable (ints borda direita). Também funciona no modo RTL.
Antes de 4.2 paddingLeft estava ignorando o buttonDrawable - ele foi retirado da borda esquerda da visualização CompoundButton.
Você pode resolvê-lo via XML - defina paddingLeft como buttonDrawable.width + requiredSpace em androids mais antigos. Configure-o como requiredSpace apenas na API 17 acima. Por exemplo, use recursos de dimensão e substitua na pasta values-v17 resource.
A alteração foi introduzida via android.widget.CompoundButton.getCompoundPaddingLeft ();
fonte
android:background="@android:color/transparent"
.Sim, você pode adicionar preenchimento adicionando preenchimento.
android:padding=5dp
fonte
Se você deseja um design limpo sem códigos, use:
O truque é definir a cor como transparente
android:drawableLeft
e atribuir um valor aandroid:drawablePadding
. Além disso, a transparência permite que você use essa técnica em qualquer cor de fundo sem o efeito colateral - como incompatibilidade de cores.fonte
API 17 e acima, você pode usar:
API 16 e abaixo, você pode usar:
fonte
No meu caso, resolvi esse problema usando o seguinte atributo CheckBox no XML:
*
*
fonte
Solução simples, adicione esta linha nas propriedades CheckBox , substitua 10dp pelo valor de espaçamento desejado
fonte
Eu não conheço caras, mas eu testei
<CheckBox android:paddingLeft="8mm"
e move apenas o texto para a direita, não para o controle inteiro.Isso combina comigo.
fonte
Por que não apenas estender a caixa de seleção do Android para ter um melhor preenchimento? Dessa forma, em vez de precisar corrigi-lo no código toda vez que você usar o CheckBox, basta usar o CheckBox fixo.
Primeira caixa de seleção de extensão:
Segundo no seu xml, em vez de criar um CheckBox normal, crie o seu estendido
fonte
Acabei de concluir sobre isso:
Substitua CheckBox e adicione este método se você tiver um drawable personalizado:
ou isso se você usar o drawable do sistema:
Obrigado pela resposta :)
fonte
Esse comportamento parece ter sido alterado no Jelly Bean. O truque paddingLeft adiciona preenchimento adicional, deixando o texto muito à direita. Alguém mais percebeu isso?
fonte
Para espaço entre a marca de seleção e o texto, use:
Mas fica mais do que 10dp, porque a marca de seleção contém preenchimento (cerca de 5dp) ao redor. Se você deseja remover o preenchimento, consulte Como remover o preenchimento no Android CheckBox :
fonte
fonte
Bad idea for usability
Não, não é. Coloque a caixa de seleção e a exibição de texto em um layout linear e torne esse layout linear possível de tocar.Se você tiver um seletor de imagem personalizado para a caixa de seleção ou o botão de opção, defina as mesmas propriedades de botão e plano de fundo, como esta:
Você pode controlar o tamanho da caixa de seleção ou do preenchimento dos botões de opção com a propriedade background.
fonte
somente você precisa ter um parâmetro no arquivo xml
fonte
Definir minHeight e minWidth como
0dp
a solução mais limpa e direta para mim na API do Android 9 28:fonte
Se você estiver criando botões personalizados, por exemplo, consulte o tutorial de alteração de aparência do checkbox
Depois, simplesmente aumente a largura de btn_check_label_background.9.png adicionando uma ou mais duas colunas de pixels transparentes no centro da imagem; deixe os marcadores de 9 patches como estão.
fonte
O que eu fiz foi ter um
TextView
e umCheckBox
dentro de um (relativo)Layout
. OTextView
exibe o texto que eu quero que o usuário veja eCheckBox
não possui nenhum texto. Dessa forma, eu posso definir a posição / preenchimento deCheckBox
onde eu quiser.fonte
Eu tive o mesmo problema com um Galaxy S3 mini (Android 4.1.2) e simplesmente fiz minha caixa de seleção personalizada estender AppCompatCheckBox em vez de CheckBox. Agora funciona perfeitamente.
fonte
Você precisa obter o tamanho da imagem que está usando para adicionar seu preenchimento a esse tamanho. Nos internos do Android, eles obtêm o drawable que você especifica no src e usam seu tamanho posteriormente. Como é uma variável privada e não há getters, você não pode acessá-la. Além disso, você não pode obter o com.android.internal.R.styleable.CompoundButton e obter o drawable a partir daí.
Portanto, você precisa criar seu próprio estilo (ou seja, custom_src) ou adicioná-lo diretamente na sua implementação do RadioButton:
fonte
Como você provavelmente usa um seletor de drawable para sua
android:button
propriedade, você precisa adicionarandroid:constantSize="true"
e / ou especificar um drawable padrão como este:Depois disso, você precisa especificar o
android:paddingLeft
atributo na sua caixa de seleção xml.Contras:
No editor de layout, você encontrará o texto embaixo da caixa de seleção com a API 16 e abaixo; nesse caso, você poderá corrigi-lo criando sua classe de caixa de seleção personalizada, como sugerido, mas para o nível 16 da API.
Fundamentação:
é um bug, pois a
StateListDrawable#getIntrinsicWidth()
chamada é usada internamente,CompoundButton
mas pode retornar< 0
valor se não houver estado atual e nenhum tamanho constante for usado.fonte
Tudo o que você precisa fazer para superar esse problema é adicionar
android:singleLine="true"
aocheckBox
layout xml do seu android:e nada de especial será adicionado programaticamente.
fonte
A imagem da caixa de seleção estava sobreposta quando usei meus próprios drawables do seletor, resolvi isso usando o código abaixo:
Agradecimentos a Alex Semeniuk
fonte
Termino com esse problema alterando as imagens. Acabei de adicionar um fundo transparente extra em arquivos png. Esta solução funciona excelente em todas as APIs.
fonte
Talvez seja tarde demais, mas eu criei métodos utilitários para gerenciar esse problema.
Basta adicionar estes métodos aos seus utils:
E use assim:
ou assim:
fonte
Em vez de ajustar o texto para a caixa de seleção, fiz o seguinte e funcionou para mim em todos os dispositivos. 1) No XML, adicione a caixa de seleção e uma visualização de texto adjacentes uma após a outra; mantendo alguma distância. 2) Defina o tamanho do texto da caixa de seleção para 0sp. 3) Adicione texto relativo a essa exibição de texto ao lado da caixa de seleção.
fonte
<CheckBox android:drawablePadding="16dip"
- O preenchimento entre as gavetas e o texto.fonte