Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android – Espaciado entre CheckBox y texto

¿Hay una manera fácil de agregar relleno entre la casilla de verificación en un control CheckBox y el texto asociado?

No puedo añadir espacios principales, porque mi etiqueta es multi-line.

Tal como está, el texto está demasiado cerca de la casilla de verificación: texto alternativo

  • Efectos del acolchado negativo
  • Tratando de entender los márgenes en LinearLayout dentro de ScrollView
  • Dibujar un rectángulo relleno con un borde en android
  • ¿Cambiar el fondo también cambia el relleno de un LinearLayout?
  • ActionBarSherlock - ¿Cómo configurar el relleno del icono de cada barra de acción?
  • El relleno se pierde con la etiqueta <merge> con el componente compuesto personalizado
  • Cómo eliminar el relleno de Android CheckBox
  • Añadir margen mayor a EditText en Android AlertDialog
  • 27 Solutions collect form web for “Android – Espaciado entre CheckBox y texto”

    Odio responder a mi propia pregunta, pero en este caso creo que necesito. Después de comprobarlo, @Falmarri estaba en el camino correcto con su respuesta. El problema es que el control CheckBox de Android ya utiliza la propiedad android: paddingLeft para obtener el texto donde está.

    La línea roja muestra el valor de desplazamiento paddingLeft de todo el CheckBox

    texto alternativo

    Si acabo de reemplazar ese relleno en mi diseño XML, se ensucia el diseño. Esto es lo que establece paddingLeft = "0":

    texto alternativo

    Resulta que no se puede arreglar esto en XML. Lo has hecho en código. Aquí está mi fragmento con un aumento de relleno con codificación de 10dp.

     final float scale = this.getResources().getDisplayMetrics().density; checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f), checkBox.getPaddingTop(), checkBox.getPaddingRight(), checkBox.getPaddingBottom()); 

    Esto le da lo siguiente, donde la línea verde es el aumento de relleno. Esto es más seguro que hardcoding un valor, ya que diferentes dispositivos podrían utilizar diferentes drawables para la casilla de verificación.

    texto alternativo

    ACTUALIZACIÓN – Como la gente ha mencionado recientemente en las respuestas a continuación, este comportamiento ha cambiado aparentemente en Jelly Bean (4.2). Su aplicación tendrá que comprobar en qué versión se está ejecutando y utilizar el método apropiado.

    Dada la respuesta de @DougW, lo que hago para administrar la versión es más sencillo, agrego a mi vista de verificación:

     android:paddingLeft="@dimen/padding_checkbox" 

    Donde el dimen se encuentra en dos carpetas de valores:

    valores

     <resources> <dimen name="padding_checkbox">25dp</dimen> </resources> 

    Valores-v17 (4,2 JellyBean)

     <resources> <dimen name="padding_checkbox">10dp</dimen> </resources> 

    Tengo una comprobación personalizada, utilizar el dps a su mejor opción.

    Utilice el atributo android:drawableLeft lugar de android:button . Para fijar el relleno entre drawable y el uso del texto android:drawablePadding . Para colocar el uso android:paddingLeft .

     <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@null" android:drawableLeft="@drawable/check_selector" android:drawablePadding="-50dp" android:paddingLeft="40dp" /> 

    resultado

    Android 4.2 Jelly Bean (API 17) coloca el texto paddingLeft de la buttonDrawable (ints right edge). También funciona para el modo RTL.

    Antes de paddingLeft 4.2 estaba ignorando el buttonDrawable – se tomó desde el borde izquierdo de la vista CompoundButton.

    Puedes resolverlo a través de XML – set paddingLeft to buttonDrawable.width + requiredSpace en androides más antiguos. Establecerlo en requiredSpace sólo en la API 17. Por ejemplo, utilice recursos de dimensión y anule en la carpeta de recursos de valores-v17.

    El cambio se introdujo a través de android.widget.CompoundButton.getCompoundPaddingLeft ();

    Sí, puede agregar relleno añadiendo relleno.

    android:padding=5dp

    Si desea un diseño limpio sin códigos, utilice:

     <CheckBox android:id="@+id/checkBox1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:drawableLeft="@android:color/transparent" android:drawablePadding="10dp" android:text="CheckBox"/> 

    El truco es establecer el color a transparente para android:drawableLeft y asignar un valor para android:drawablePadding . Además, la transparencia le permite utilizar esta técnica en cualquier color de fondo sin el efecto secundario, como la falta de coincidencia de color.

    ¿Por qué no sólo ampliar el Android CheckBox para tener mejor relleno en su lugar. Esa manera en vez de tener que fijarla en código cada vez que usted utiliza el CheckBox usted puede apenas utilizar el CheckBox fijo en lugar de otro.

    Primero Extender CheckBox:

     package com.whatever; import android.content.Context; import android.util.AttributeSet; import android.widget.CheckBox; /** * This extends the Android CheckBox to add some more padding so the text is not on top of the * CheckBox. */ public class CheckBoxWithPaddingFix extends CheckBox { public CheckBoxWithPaddingFix(Context context) { super(context); } public CheckBoxWithPaddingFix(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CheckBoxWithPaddingFix(Context context, AttributeSet attrs) { super(context, attrs); } @Override public int getCompoundPaddingLeft() { final float scale = this.getResources().getDisplayMetrics().density; return (super.getCompoundPaddingLeft() + (int) (10.0f * scale + 0.5f)); } } 

    Segundo en tu xml en lugar de crear un CheckBox normal, crea tu extensión

     <com.whatever.CheckBoxWithPaddingFix android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello there" /> 

    Solución simple, agregue esta línea en las propiedades CheckBox , reemplace 10dp con el valor de espaciado deseado

     android:paddingLeft="10dp" 

    No sé chicos, pero he probado

    <CheckBox android:paddingLeft="8mm" y sólo mueve el texto a la derecha, no todo el control.

    Me queda bien.

    En mi caso he resuelto este problema utilizando este siguiente atributo CheckBox en el XML:

    *

    Android: paddingLeft = "@ dimen / activity_horizontal_margin"

    *

    API 17 y superior, puede utilizar:

    Android: paddingStart = "24dp"

    API 16 y siguientes, puede utilizar:

    Android: paddingLeft = "24dp"

    Acabo de concluir en esto:

    Anule CheckBox y agregue este método si tiene un dibujable personalizado:

     @Override public int getCompoundPaddingLeft() { // Workarround for version codes < Jelly bean 4.2 // The system does not apply the same padding. Explantion: // http://stackoverflow.com/questions/4037795/android-spacing-between-checkbox-and-text/4038195#4038195 int compoundPaddingLeft = super.getCompoundPaddingLeft(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { Drawable drawable = getResources().getDrawable( YOUR CUSTOM DRAWABLE ); return compoundPaddingLeft + (drawable != null ? drawable.getIntrinsicWidth() : 0); } else { return compoundPaddingLeft; } } 

    O esto si usas el sistema dibujable:

     @Override public int getCompoundPaddingLeft() { // Workarround for version codes < Jelly bean 4.2 // The system does not apply the same padding. Explantion: // http://stackoverflow.com/questions/4037795/android-spacing-between-checkbox-and-text/4038195#4038195 int compoundPaddingLeft = super.getCompoundPaddingLeft(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { final float scale = this.getResources().getDisplayMetrics().density; return compoundPaddingLeft + (drawable != null ? (int)(10.0f * scale + 0.5f) : 0); } else { return compoundPaddingLeft; } } 

    Gracias por la respuesta 🙂

    Este comportamiento parece haber cambiado en Jelly Bean. El truco paddingLeft agrega relleno adicional, haciendo que el texto se vea demasiado a la derecha. ¿Alguien más notó eso?

     <CheckBox android:paddingRight="12dip" /> 

    Si tiene un selector de imagen personalizado para la casilla de verificación o el botón de radio, debe establecer el mismo botón y la propiedad de fondo, como esto:

      <CheckBox android:id="@+id/filter_checkbox_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:button="@drawable/selector_checkbox_filter" android:background="@drawable/selector_checkbox_filter" /> 

    Puede controlar el tamaño de la casilla de verificación o el relleno del botón de radio con la propiedad de fondo.

    Si está creando botones personalizados, por ejemplo, ver cambio de aspecto de la casilla de verificación tutorial

    A continuación, simplemente aumente el ancho de btn_check_label_background.9.png añadiendo una o dos columnas más de píxeles transparentes en el centro de la imagen; Dejar los marcadores de 9 parches como están.

    Lo que hice, es tener un TextView y un CheckBox dentro de un Layout (Relativo). El TextView muestra el texto que quiero que el usuario vea, y el CheckBox no tiene ningún texto. De esa manera, puedo establecer la posición / relleno de la CheckBox donde quiera.

    Solo necesitas tener un parámetro en el archivo xml

     android:paddingLeft="20dp" 

    Tuve el mismo problema con un Galaxy S3 mini (android 4.1.2) y simplemente hice mi checkbox personalizado extender AppCompatCheckBox en lugar de CheckBox. Ahora funciona perfectamente.

    Usted necesita conseguir el tamaño de la imagen que usted está utilizando para agregar su relleno a este tamaño. En los internos de Android, obtienen el dibujable que especifique en src y utilice su tamaño después. Ya que es una variable privada y no hay getters que no se puede acceder a ella. También usted no puede conseguir el com.android.internal.R.styleable.CompoundButton y conseguir el drawable de allí.

    Así que necesitas crear tu propio estilo (es decir, custom_src) o puedes agregarlo directamente en tu implementación del RadioButton:

     public class CustomRadioButton extends RadioButton { private Drawable mButtonDrawable = null; public CustomRadioButton(Context context) { this(context, null); } public CustomRadioButton(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomRadioButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mButtonDrawable = context.getResources().getDrawable(R.drawable.rbtn_green); setButtonDrawable(mButtonDrawable); } @Override public int getCompoundPaddingLeft() { if (Util.getAPILevel() <= Build.VERSION_CODES.JELLY_BEAN_MR1) { if (drawable != null) { paddingLeft += drawable.getIntrinsicWidth(); } } return paddingLeft; } } 

    Como probablemente utilice un selector para su android:button propiedad que necesita para agregar android:constantSize="true" y / o especificar un valor predeterminado dibujable como este:

     <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize="true"> <item android:drawable="@drawable/check_on" android:state_checked="true"/> <item android:drawable="@drawable/check_off"/> </selector> 

    Después de eso usted necesita especificar el atributo android:paddingLeft en su casilla de verificación xml.

    Contras:

    En el editor de la disposición usted pasará el texto debajo de la caja de cheque con api 16 y abajo, en ese caso usted puede fijarlo creando la clase de la casilla de encargo como sugerido pero para el nivel 16 de la api.

    Razón fundamental:

    Es un error como StateListDrawable#getIntrinsicWidth() llamada se utiliza internamente en CompoundButton pero puede devolver < 0 valor si no hay estado actual y no se utiliza el tamaño constante.

    Todo lo que tienes que hacer para superar este problema es añadir android:singleLine="true" al checkBox en tu diseño de Android xml:

     <CheckBox android:id="@+id/your_check_box" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:background="@android:color/transparent" android:text="@string/your_string"/> 

    Y nada especial se agregará mediante programación.

    La imagen de la casilla de verificación estaba superponiendo cuando utilicé mis propios drawables del selector, tengo resolver esto usando código abajo:

     CheckBox cb = new CheckBox(mActivity); cb.setText("Hi"); cb.setButtonDrawable(R.drawable.check_box_selector); cb.setChecked(true); cb.setPadding(cb.getPaddingLeft(), padding, padding, padding); 

    Gracias a Alex Semeniuk

    Termino con este problema cambiando las imágenes. Acaba de añadir fondo extra transparente en los archivos PNG. Esta solución funciona excelente en todas las API.

    Tal vez sea tarde, pero he creado métodos de utilidad para gestionar este problema.

    Sólo tienes que añadir estos métodos a tus utils:

     public static void setCheckBoxOffset(@NonNull CheckBox checkBox, @DimenRes int offsetRes) { float offset = checkBox.getResources().getDimension(offsetRes); setCheckBoxOffsetPx(checkBox, offset); } public static void setCheckBoxOffsetPx(@NonNull CheckBox checkBox, float offsetInPx) { int leftPadding; if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) { leftPadding = checkBox.getPaddingLeft() + (int) (offsetInPx + 0.5f); } else { leftPadding = (int) (offsetInPx + 0.5f); } checkBox.setPadding(leftPadding, checkBox.getPaddingTop(), checkBox.getPaddingRight(), checkBox.getPaddingBottom()); } 

    Y utilizar de esta manera:

      ViewUtils.setCheckBoxOffset(mAgreeTerms, R.dimen.space_medium); 

    O como esto:

      // Be careful with this usage, because it sets padding in pixels, not in dp! ViewUtils.setCheckBoxOffsetPx(mAgreeTerms, 100f); 

    En lugar de ajustar el texto de la casilla de verificación, he hecho lo siguiente y funcionó para mí para todos los dispositivos. 1) En XML, agregue una casilla de verificación y una vista de texto adyacente a una tras otra; Manteniendo una cierta distancia. 2) Establecer el tamaño de la casilla de verificación a 0sp. 3) Añada texto relativo a esa vista de texto junto a la casilla de verificación.

    <CheckBox android:drawablePadding="16dip" – El relleno entre los elementos desplegables y el texto.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.