Android – checkbox和文本之间的间距

是否有一个简单的方法来添加checkbox之间的CheckBox控件和相关的文本?

我不能只添加前导空格,因为我的标签是多行的。

原样,文本太靠近checkbox: 替代文字

我讨厌回答我自己的问题,但在这种情况下,我认为我需要。 检查出来后,@Falmarri的回答是正确的。 问题是Android的CheckBox控件已经使用android:paddingLeft属性来获取文本的位置。

红线显示整个CheckBox的paddingLeft偏移值

替代文字

如果我只是在我的XML布局中重写该填充,则会混淆布局。 这是什么设置paddingLeft =“0”:

替代文字

原来你不能用XML解决这个问题。 你已经做了代码。 这是我的硬编码填充增加10dp的片段。

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

这给你以下,绿线是填充的增加。 这比硬编码值更安全,因为不同的设备可以使用不同的可绘制的checkbox。

替代文字

更新 – 正如人们最近在下面的答案中提到的,这种行为在Jelly Bean(4.2)中已经明显改变了。 您的应用程序将需要检查运行的版本,并使用适当的方法。

鉴于@DougW响应,我做什么来pipe理版本更简单,我添加到我的checkbox视图:

 android:paddingLeft="@dimen/padding_checkbox" 

在两个值文件夹中find维:

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

值-V17(4.2果冻豆)

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

我有一个自定义的检查,使用DPS你最好的select。

使用属性android:drawableLeft来代替android:button 。 为了设置可绘制和文本之间的填充使用android:drawablePadding 。 定位drawable使用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" /> 

结果

Android 4.2 Jelly Bean(API 17)将buttonDrawable中的文本paddingLeft(ints右边缘)。 它也适用于RTL模式。

在4.2 paddingLeft忽略buttonDrawable之前,它是从CompoundButton视图的左边缘获取的。

你可以通过XML解决它 – 设置paddingLeft buttonDrawable.width + requiredSpace在较旧的机器人。 将其仅设置为API 17上的requiredSpace。 例如,使用维度资源并在值-V17资源文件夹中重写。

更改是通过android.widget.CompoundButton.getCompoundPaddingLeft();

是的,你可以通过添加填充来添加填充。

android:padding=5dp

如果你想要一个没有代码的干净的devise,使用:

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

技巧是将颜色设置为透明的android:drawableLeft并为android:drawableLeft分配一个值。 此外,透明度允许您在任何背景颜色上使用此技术,而不会产生副作用 – 如颜色不匹配。

为什么不扩展Android CheckBox来取代更好的填充? 这样,而不是每次使用CheckBox时必须在代码中修复它,您可以使用固定的CheckBox。

首先扩展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)); } } 

其次在你的XML而不是创build一个正常的CheckBox创build你的扩展

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

简单的解决scheme,在CheckBox属性中添加此行,将10dpreplace为所需的间距值

 android:paddingLeft="10dp" 

我不认识的人,但我testing过

<CheckBox android:paddingLeft="8mm" ,只将文本移动到右侧,而不是整个控件。

这很适合我。

在我的情况下,我解决了这个问题在XML中使用以下CheckBox属性:

*

机器人:paddingLeft = “@扪/ activity_horizo​​ntal_margin”

*

API 17及以上版本,您可以使用:

机器人:paddingStart = “24dp”

API 16及以下版本,您可以使用:

机器人:paddingLeft = “24dp”

我刚才在这里总结:

如果您有自定义绘图,请覆盖CheckBox并添加此方法:

 @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; } } 

或者如果你使用系统drawable:

 @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; } } 

感谢你的回答 :)

这种行为似乎已经在果冻豆中发生了变化。 paddingLeft技巧增加了额外的填充,使文本看起来太正确。 其他人注意到了吗?

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

如果您有checkbox或单选button的自定义图像select器,则必须设置相同的button和背景属性,例如:

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

您可以控制checkbox或单选button填充大小的背景属性。

只有你需要在xml文件中有一个参数

 android:paddingLeft="20dp" 

如果您正在创build自定义button,请参阅checkbox教程的更改外观

然后通过在图像中心添加一列或两列透明像素来简单地增加btn_check_label_background.9.png的宽度; 留下9贴片标记。

我所做的是在一个(相对) Layout有一个TextView和一个CheckBoxTextView显示我希望用户看到的文本, CheckBox没有任何文本。 这样,我可以在任何地方设置CheckBox的位置/填充。

我有一个与Galaxy S3迷你(Android 4.1.2)相同的问题,我只是让我的自定义checkbox扩展AppCompatCheckBox而不是CheckBox。 现在它完美的工作。

您需要获取您正在使用的图像的大小,以将您的填充添加到此大小。 在Android内部,他们得到你在src中指定的drawable,然后使用它的大小。 由于它是一个私有variables,并且没有获取者,所以你不能访问它。 你也不能得到com.android.internal.R.styleable.CompoundButton并从那里获取drawable。

所以你需要创build你自己的样式(即custom_src),或者你可以直接在你的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; } } 

正如你可能使用一个可绘制的select器为你的android:button属性,你需要添加android:constantSize="true"和/或指定一个默认的drawable像这样:

 <?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> 

之后,您需要在checkboxxml中指定android:paddingLeft属性。

缺点:

在布局编辑器中,您将使用api 16或更低版本的checkbox下的文本,在这种情况下,您可以通过创build自定义checkbox类(如build议的但为api级别16)来修复它。

理由:

它是一个错误,因为StateListDrawable#getIntrinsicWidth()调用在CompoundButton内部使用,但如果没有当前状态并且没有使用常量大小,它可能会返回< 0值。

所有你需要做的,以解决这个问题是添加android:singleLine="true"到android xml布局中的checkBox

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

并没有什么特别的将通过编程添加。

checkbox图像重叠时,我用我自己的drawables从select器,我已经解决了这个使用下面的代码:

 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); 

感谢Alex Semeniuk

我通过更改图像结束了这个问题。 只是在png文件中增加了额外的透明背景。 这个解决scheme在所有的API上都非常出色。

也许是晚了,但我已经创build了实用的方法来解决这个问题。

只需将这些方法添加到您的使用情况:

 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()); } 

像这样使用:

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

或者像这样:

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

而不是调整checkbox的文本,我做了以下的事情,它为我所有的设备工作。 1)在XML中,添加checkbox和文本视图到相邻的一个; 保持一段距离。 2)将checkbox文本大小设置为0sp。 3)将相对文本添加到该checkbox旁边的textview。

<CheckBox android:drawablePadding="16dip" – 绘图和文本之间的填充。