有没有一种简单的方法可以在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());
以下是代码示例,其中绿色线条表示填充增加的情况。这种做法比硬编码数值更为安全,因为不同的设备可能会对复选框使用不同的可绘制对象。
更新 - 如下面答案中最近有人提到的,该行为在Jelly Bean(4.2)中已经改变。您的应用程序需要检查它所运行的版本,并使用相应的方法。
对于4.3及以上版本,只需设置padding_left属性即可。有关详细信息,请参见htafoya的答案。
paddingLeft="48sp"
有什么问题吗?我这里可以正常工作,即使我更改比例和方向。但是你的代码在一系列项目上给我提供了不稳定的填充值。 - harpogetView()
中(如果您回收视图),您不能使用此解决方案,因为填充将无限增加。为了解决这个问题,我不得不使用类似于以下内容的东西:boolean isHackNeeded = Build.VERSION.SDK_INT < 17; float scale = context.getResources().getDisplayMetrics().density; if (isHackNeeded) {CheckBox rb = new CheckBox(context); this.PADDING = rb.getPaddingLeft() + Math.round(10.0f * scale); } else { this.PADDING = Math.round(10.0f * scale); }
。然后对我膨胀的每个复选框使用PADDING
:check.setPadding(PADDING, check.getPaddingTop() ...
- Alex Semeniuk根据@DougW的回答,我管理版本的方法更简单,我在我的复选框视图中添加:
android:paddingLeft="@dimen/padding_checkbox"
dimen在两个values文件夹中找到:
values
<resources>
<dimen name="padding_checkbox">0dp</dimen>
</resources>
数值-v17 (4.2 果冻豆)
<resources>
<dimen name="padding_checkbox">10dp</dimen>
</resources>
我有一个自定义检查,根据您的需求使用最佳的dps。
values-v17
。 - icecreamman使用属性 android:drawableLeft
替代 android:button
。为了在可绘制对象和文本之间设置填充,请使用 android:drawablePadding
。要定位可绘制对象,请使用 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:background="@android:color/transparent"
,左边距将消失。 - madeuz<item name="android:checkboxStyle">@style/CheckBox</item>
这样,您只需定义一次样式并引用一次即可。 - RosomackAndroid 4.2 Jelly Bean (API 17)将文本的paddingLeft从buttonDrawable(int的右边缘)开始。它还适用于RTL模式。
在4.2之前,paddingLeft忽略了buttonDrawable - 它是从CompoundButton视图的左边缘取出的。
您可以通过XML解决此问题-在旧版Android上将paddingLeft设置为buttonDrawable.width + requiredSpace。在API 17及更高版本上仅设置为requiredSpace。例如,使用尺寸资源,并在values-v17资源文件夹中覆盖。
该更改是通过android.widget.CompoundButton.getCompoundPaddingLeft()引入的。
android:background="@android:color/transparent"
成功修复了旧代码中的问题。 - Sebek是的,您可以通过添加内边距来添加内边距。
android:padding=5dp
如果您想要一个不需要编码的简洁设计,请使用:
<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:drawablePadding
分配一个值。此外,透明度允许您在任何背景颜色上使用此技术,而无需担心副作用,比如颜色不匹配。
在API 17及以上版本中,您可以使用:
android:paddingStart="24dp"
在API 16及以下版本中,您可以使用:
android:paddingLeft="24dp"
*
android:paddingLeft="@dimen/activity_horizontal_margin"
*
(注意:该翻译保留了原文中的 HTML 标签。)简单的解决方案,将此行添加到CheckBox属性中,用您想要的间距值替换10dp
android:paddingLeft="10dp"
我不知道各位是否了解,但我测试了这段代码:
<CheckBox android:paddingLeft="8mm"
,发现只会将文本向右移动,并没有移动整个控件。
这个对我来说已经足够了。
drawableLeft
的TextView
,并使用drawablePadding
为文本留出空间。在代码中只需切换选定和未选定状态即可。 - Muhammad Babar