¿Agregar margen entre un RadioButton y su etiqueta en Android?

88

¿Es posible agregar un poco de espacio entre un RadioButton y la etiqueta mientras se siguen usando los componentes integrados de Android? Por defecto, el texto parece un poco arrugado.

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

Probé un par de cosas:

  1. La especificación de margen y relleno parece agregar espacio alrededor de todo el elemento (botón y texto, juntos). Eso tiene sentido, pero no hace lo que necesito.

  2. Crear un elemento de diseño personalizado a través de XML que especifique imágenes para los estados marcado y no marcado, luego agregar algunos píxeles adicionales al lado derecho de cada imagen. Esto debería funcionar, pero ahora está saliendo de la interfaz de usuario predeterminada. (No es el fin del mundo, pero no es ideal)

  3. Agregue espacio en blanco adicional al comienzo de cada etiqueta. Android parece recortar un carácter de espacio inicial, como en "My String", pero especificar unicode U + 00A0, como en "\ u00A0My String" funciona. Esto funciona, pero parece un poco sucio.

¿Alguna mejor solución?

allclaws
fuente

Respuestas:

120

Para cualquiera que lea esto ahora, la respuesta aceptada conducirá a algunos problemas de diseño en las API más nuevas, lo que provocará demasiado relleno.

En API <= 16, puede configurar paddingLeftel botón de opción para configurar el relleno en relación con los límites de vista del botón de opción. Además, un fondo del parche nueve también cambia los límites de la vista en relación con la vista.

En API> = 17, el paddingLeft(o paddingStart) está en relación con el botón de opción que se puede dibujar. Lo mismo se aplica al parche nueve. Para ilustrar mejor las diferencias de relleno, consulte la captura de pantalla adjunta.

Si examina el código, encontrará un nuevo método en API 17 llamado getHorizontalOffsetForDrawables . Este método se llama al calcular el relleno izquierdo de un botón de opción (de ahí el espacio adicional ilustrado en la imagen).

TL; DR Solo utilícelo paddingLeftsi minSdkVersiones> = 17. Si es compatible con API <= 16, debe tener un estilo de botón de opción para el SDK mínimo que admite y otro estilo para API 17+.

combinar capturas de pantalla que muestran las diferencias de relleno izquierdo entre las versiones de API

Jim Baca
fuente
2
api 17 es android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
KarenAnne
11
La mejor manera de hacer esto es con un directorio "values-v17"; ponga su dimensión API 17+ en un xml de recursos allí y la estándar para 16 y menos en simplemente "valores".
akent
15
Es increíble cómo los desarrolladores / administradores de Google nos tratan a los desarrolladores habituales. Hacen lo que quieren, cuando quieren. La consistencia y la integridad no significan nada para ellos.
Yar
66

No estoy seguro de si esto solucionará su problema, pero ¿ha probado la propiedad "Padding left" del botón de opción con un valor de 50dip o más?

user438650
fuente
2
Esto funciona y se necesita 50dip para cubrir el ancho del elemento de diseño predeterminado. ¡Al principio usé 20dip y el texto se movió hacia la izquierda! Eso es porque el punto de anclaje no es el borde derecho del dibujable; es el borde izquierdo del dibujable.
Robert Claypool
58

Intenté de varias maneras y terminé con este funcionando correctamente tanto en el emulador como en los dispositivos:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: fondo debe ser transparente, como parece en api10, hay un fondo con rellenos intrínsecos (no se probó con otras apis, pero la solución también funciona en otras)
  • android: el botón debe ser nulo ya que los rellenos no funcionarán correctamente de lo contrario
  • android: drawableLeft debe especificarse en lugar de android: button
  • android: drawablePadding es el espacio que estará entre su dibujable y su texto
Gianluca P.
fuente
4
¡La mejor respuesta! También puede configurar android: background = "@ null" y se verá como indicó sin relleno.
saiyancoder
2
cuando estoy configurando android: button = "@ null", el botón de radio no se marca (se hace clic). Estoy haciendo algo mal. por favor ayude a stackoverflow.com/questions/28052820/…
Shirish Herwade
@Shirish, esta solución no tiene nada que ver con que no se haga clic en su botón. Lo acabo de implementar y se hace clic.
Yar
¡Gracias por la solución!
Vimalathithan Rajasekaran
32

Añadir el margen entre un botón de radio de su etiqueta por paddingLeft :

android:paddingLeft="10dip"

Simplemente configure su relleno personalizado .

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

Hecho

Hiren Patel
fuente
22

Utilice los siguientes atributos XML. Funcionó para mi

Para API <= 16 uso

android:paddingLeft="16dp"

Para API> = 17 uso

android:paddingStart="@16dp"

P.ej:

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

ingrese la descripción de la imagen aquí

Más más: el drawablePaddingatributo no funciona. Solo funciona si agregó un elemento de dibujo en su botón de opción. Por ejemplo:

<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
fuente
6

No puedo probar esto ahora para verificar, pero ¿ha intentado ver si el atributo android: drawablePadding hace lo que necesita?

Marca B
fuente
1
Hm. Lo intenté y no parece tener ningún efecto en esta situación. Gracias por la sugerencia, ciertamente suena bien por la descripción: "El relleno entre los dibujables y el 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
fuente
1

El relleno entre los dibujables y el texto. Se logrará agregando la línea a continuación en el archivo xml. android:drawablePadding="@dimen/10dp"

Faajir
fuente
estaba buscando exactamente esto ... me ayudó mucho
Shirish Herwade
2
@dimen/10dpmala práctica
Vlad
0

Lo he intentado, "android: paddingLeft" funcionará. paddingLeft solo afectará al texto mientras mantiene la imagen de radio en la posición original.

David Guo
fuente
-1

El "android: paddingLeft" solo parece funcionar correctamente en Android 4.2.2

He probado casi todas las versiones de Android y solo funciona en la versión 4.2.2.

Tierras bajas
fuente
-1

Estoy usando un enfoque diferente que creo que debería funcionar en todas las versiones de API. En lugar de aplicar relleno, estoy agregando una vista vacía entre RadioButtons:

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

Esto debería darle un relleno de 20 dp.

Oren Bengigi
fuente
-1

Vine aquí buscando una respuesta y la forma más simple (después de pensar un poco) fue agregar espacio al comienzo de la etiqueta como tal

<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
fuente
-1

para mi 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
fuente
-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
fuente
Considere agregar algunos comentarios para explicar cómo esto resuelve el problema;)
DeadlyJesus
-1

Puede este código en su archivo 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" />

o usa esto en la clase de actividad

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

Crea un estilo en style.xml como este

<style name="Button.Radio">

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

Pon ese estilo en el botón de radio

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

Puede cambiar cualquier atributo igual que el botón, ya que RadioButton hereda indirectamente el botón.

Vindhya Pratap Singh
fuente
-1

Sé que es una pregunta antigua, pero con esta solución, finalmente tuve tranquilidad y me olvidé del nivel de API.

RadioGroup vertical del lado izquierdo con vista de texto vertical del lado derecho.

 <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
fuente
@Mark Buikema, Absolutamente no es etiqueta, ¡pero funciona como etiqueta aquí! Si desea etiquetas de clic, puede agregar detectores de clic a TextViews. Mi punto es, ¿necesitamos implementar el diseño para cada versión del sistema operativo Android? Creo que no.
Stanley Kou
-1

Puede intentar usar el atributo de gravedad del botón de opción.

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

Esto alineará el texto al final más a la derecha. Mira la primera radio en la imagen.

ingrese la descripción de la imagen aquí

Salil Kaul
fuente