Adicionar margem entre um RadioButton e seu rótulo no Android?

90

É possível adicionar um pouco de espaço entre um RadioButton e o rótulo enquanto ainda usa os componentes internos do Android? Por padrão, o texto parece um pouco amassado.

<RadioButton android:id="@+id/rb1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="My Text"/>

Eu tentei algumas coisas:

  1. Especificar margem e preenchimento parece adicionar espaço ao redor do elemento inteiro (botão e texto, juntos). Isso faz sentido, mas não faz o que preciso.

  2. Criação de um drawable personalizado por meio de XML especificando imagens para os estados marcados e não marcados e, a seguir, adicionando alguns pixels extras ao lado direito de cada imagem. Isso deve funcionar, mas agora você está saindo da IU padrão. (Não é o fim do mundo, mas não é o ideal)

  3. Adicione espaços em branco extras no início de cada rótulo. O Android parece cortar um caractere de espaço inicial, como em "My String", mas especificar unicode U + 00A0, como em "\ u00A0My String", resolve. Isso funciona, mas parece meio sujo.

Alguma solução melhor?

allclaws
fonte

Respostas:

121

Para quem está lendo isso agora, a resposta aceita levará a alguns problemas de layout em APIs mais recentes, causando muito preenchimento.

Na API <= 16, você pode definir paddingLefto botão de opção para definir o preenchimento relativo aos limites de visualização do botão de opção. Além disso, um plano de fundo patch nine também altera os limites da vista em relação à vista.

Na API> = 17 o paddingLeft(ou paddingStart) está em relação ao drawable do botão de opção. O mesmo se aplica ao patch nove. Para ilustrar melhor as diferenças de preenchimento, consulte a captura de tela anexada.

Se você vasculhar o código, encontrará um novo método na API 17 chamado getHorizontalOffsetForDrawables . Este método é chamado ao calcular o preenchimento esquerdo para um botão de rádio (daí o espaço adicional ilustrado na imagem).

TL; DR Apenas use paddingLeftse minSdkVersionfor> = 17. Se você tiver suporte para API <= 16, deverá ter um estilo de botão de opção para o SDK mínimo que está oferecendo suporte e outro estilo para API 17+.

combinar capturas de tela mostrando diferenças de preenchimento esquerdo entre as versões da API

Jim Baca
fonte
2
api 17 é android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
KarenAnne
11
A melhor maneira de fazer isso é com um diretório "valores-v17"; coloque sua dimensão API 17+ em um xml de recursos lá e o padrão para 16 e abaixo em apenas "valores" simples.
akent
16
É incrível como os desenvolvedores / gerenciamento do Google estão tratando os desenvolvedores usuais. Eles fazem o que querem, quando querem. Consistência e integridade não significam nada para eles.
Yar
66

Não tenho certeza se isso resolverá o problema, mas você tentou a propriedade "Preenchimento à esquerda" do botão de rádio com um valor de 50dip ou mais

user438650
fonte
2
Isso funciona, e 50dip é necessário para cobrir a largura do drawable padrão. No começo usei 20dip e o texto foi para a esquerda! Isso ocorre porque o ponto de ancoragem não é a borda direita do drawable; é a borda esquerda do drawable.
Robert Claypool
58

Tentei várias maneiras e concluí com esta funcionando corretamente no emulador e nos dispositivos:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: o fundo precisa ser transparente, pois parece que na api10 há um fundo com preenchimentos intrínsecos (não testado com outras apis, mas a solução funciona em outras também)
  • android: o botão precisa ser nulo, pois os preenchimentos não funcionarão corretamente de outra forma
  • android: drawableLeft precisa ser especificado em vez de android: button
  • android: drawablePadding é o espaço que ficará entre o drawable e o texto
Gianluca P.
fonte
4
A melhor resposta! Você também pode definir android: background = "@ null" e terá a aparência que você declarou sem preenchimento.
saiyancoder
2
quando estou configurando android: button = "@ null", o botão de rádio não está sendo verificado (clicado). Eu estou fazendo algo errado. por favor, ajude stackoverflow.com/questions/28052820/…
Shirish Herwade
@Shirish, esta solução não tem nada a ver com o botão não ser clicado. Acabei de implementá-lo e ele foi clicado.
Yar
Obrigado pela solução!
Vimalathithan Rajasekaran
33

Adicione margem entre um botão de opção e seu rótulo por paddingLeft :

android:paddingLeft="10dip"

Basta definir o seu preenchimento personalizado .

Propriedade xml de RadioButton.

<RadioButton
    android:id="@+id/radHighest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/YourImageResource"
    android:drawablePadding="50dp"
    android:paddingLeft="10dip"
    android:text="@string/txt_my_text"
    android:textSize="12sp" />

Feito

Hiren Patel
fonte
22

Use os seguintes atributos XML. Funcionou para mim

Para API <= 16 use

android:paddingLeft="16dp"

Para API> = 17 use

android:paddingStart="@16dp"

Por exemplo:

<android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/popularityRadioButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:paddingEnd="@dimen/radio_button_text"
        android:paddingLeft="@dimen/radio_button_text"
        android:paddingRight="@dimen/radio_button_text"
        android:paddingStart="@dimen/radio_button_text"
        android:text="Popularity"
        android:textSize="@dimen/sort_dialog_text_size"
        android:theme="@style/AppTheme.RadioButton" />

insira a descrição da imagem aqui

Mais mais: o drawablePaddingatributo não funciona. Só funciona se você adicionar um drawable ao botão de opção. Por exemplo:

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:button="@null"
    android:drawableEnd="@android:drawable/btn_radio"
    android:drawablePadding="56dp"
    android:drawableRight="@android:drawable/btn_radio"
    android:text="New RadioButton" />
Srikar Reddy
fonte
6

Não é possível tentar isso agora para verificar, mas você tentou ver se o atributo android: drawablePadding faz o que você precisa?

Mark B
fonte
1
Hm. Experimentei e não parece ter qualquer efeito nesta situação. Obrigado pela sugestão, certamente soa direto da descrição: "O preenchimento entre os drawables e o texto".
allclaws
4
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());
Dilavar Malek
fonte
1

O preenchimento entre os drawables e o texto. Isso será alcançado adicionando a linha abaixo no arquivo xml. android:drawablePadding="@dimen/10dp"

Faakhir
fonte
eu estava procurando exatamente por isso ... me ajudou muito
Shirish Herwade
2
@dimen/10dpprática ruim
Vlad
0

Eu tentei, "android: paddingLeft" funcionará. paddingLeft afetará apenas o texto enquanto mantém a imagem do rádio na posição original.

David Guo
fonte
-1

O "android: paddingLeft" só parece funcionar corretamente no android 4.2.2

Eu tentei quase todas as versões do Android e só funciona na versão 4.2.2.

Lowerland
fonte
-1

Estou usando uma abordagem diferente que acho que deve funcionar em todas as versões da API. Em vez de aplicar preenchimento, estou adicionando uma visualização vazia entre os RadioButtons:

<View
        android:layout_width="20dp"
        android:layout_height="1dp" />

Isso deve fornecer um preenchimento de 20dp.

Oren Bengigi
fonte
-1

Eu vim aqui em busca de uma resposta e a maneira mais simples (depois de pensar um pouco) era adicionar espaçamento no início do próprio rótulo assim

<RadioGroup
     android:orientation="horizontal"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignRight="@+id/btnChangeMode"
     android:layout_marginTop="10dp"
     android:layout_marginBottom="10dp"
     android:layout_below="@+id/view3"
     android:gravity="center|left"
     android:id="@+id/ledRadioGroup">
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" On"
         android:layout_marginRight="6dp"
         android:id="@+id/ledon"
         android:textColor="@color/white" />
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" Off"
         android:layout_marginLeft="6dp"
         android:id="@+id/ledoff"
         android:textColor="@color/white" />
jtizzle
fonte
-1

para mim funciona:

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true">
            <layer-list>
                <item android:right="5dp">
                    <shape android:paddingLeft="5dp" android:shape="oval">
                     <size android:width="20dp" android:height="20dp" />
                     <solid android:color="@color/blue" />
            </shape>
        </item>
    </layer-list>
</item>
<item android:paddingLeft="5dp" android:state_checked="false">
    <layer-list>
        <item android:right="5dp">
            <shape android:paddingLeft="5dp" android:shape="oval">
                <size android:width="20dp" android:height="20dp" />
                <solid android:color="@color/grey" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>
Vadim
fonte
-1
<RadioButton
                android:id="@+id/rb1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:background="@null"
                android:paddingLeft="20dp"
                android:text="1"
                android:textColor="@color/text2"
                android:textSize="16sp"
                android:textStyle="bold" />
Dhaval Shingala
fonte
Considere adicionar alguns comentários para explicar como isso resolve o problema;)
DeadlyJesus
-1

Você pode este código em seu arquivo XML

<RadioButton
android:id="@+id/rButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="50dp"
android:paddingLeft="10dip"
android:text="@string/your_text" />

ou use isso na aula de atividades

radioButton.setPadding(12, 10, 0, 10);
Faxriddin Abdullayev
fonte
-1

Crie um estilo em style.xml como este

<style name="Button.Radio">

    <item name="android:paddingLeft">@dimen/spacing_large</item>
    <item name="android:textSize">16sp</item>
</style>

Coloque esse estilo no botão de opção

 <RadioButton
                android:id="@+id/rb_guest_busy"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="@string/guest_is_waiting"
                android:textSize="@dimen/font_size_3x_medium"
                android:drawablePadding="@dimen/spacing_large"
                android:textColor="@color/color_text_heading_dark"
                style="@style/Button.Radio"/>

Você pode alterar qualquer atributo como o botão, pois RadioButton herda indiretamente o botão.

Vindhya Pratap Singh
fonte
-1

Eu sei que é uma questão antiga, mas com esta solução, finalmente consegui ficar tranquilo e esquecer o nível de API.

RadioGroup vertical do lado esquerdo com visualização de texto vertical do lado direito.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RadioGroup>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 2"/>
    </LinearLayout>
</LinearLayout>
Stanley Kou
fonte
@Mark Buikema, Com certeza não é rótulo, mas funciona como rótulo aqui! Se quiser rótulos de clique, você pode adicionar ouvintes de clique a TextViews. Meu ponto é, precisamos implementar layout para todas as versões do sistema operacional Android? Eu acho que não.
Stanley Kou,
-1

Você pode tentar usar o atributo de gravidade do botão de rádio.

<RadioButton
                        android:id="@+id/rb_all"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:checked="true"
                        android:gravity="right|center_vertical"
                        android:padding="@dimen/padding_30dp"
                        android:text="@string/filter_inv_all"
                        android:textColor="@color/black"
                        android:textSize="@dimen/text_size_18" />

Isso alinhará o texto na extremidade direita. Confira o primeiro rádio da imagem.

insira a descrição da imagem aqui

Salil Kaul
fonte