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_horizontal_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
和一个CheckBox
。 TextView
显示我希望用户看到的文本, 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"
– 绘图和文本之间的填充。