Android - 复选框和文本之间的间距
有没有一种简单的方法可以在 CheckBox 控件中的复选框和关联文本之间添加填充?
我不能只添加前导空格,因为我的标签是多行的。
按原样,文本距离复选框太近:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有没有一种简单的方法可以在 CheckBox 控件中的复选框和关联文本之间添加填充?
我不能只添加前导空格,因为我的标签是多行的。
按原样,文本距离复选框太近:
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(30)
我不想回答我自己的问题,但在这种情况下我认为我需要回答。经过检查后,@Falmarri 的答案是正确的。问题是 Android 的 CheckBox 控件已经使用 android:paddingLeft 属性来获取文本所在的位置。
红线显示整个复选框的 paddingLeft 偏移值
如果我只是在 XML 布局中覆盖该填充,则它搞乱了布局。以下是设置 paddingLeft="0" 的作用:
事实证明,您无法在 XML 中修复此问题。你已经用代码做到了。这是我的代码片段,硬编码填充增加了 10dp。
这将为您提供以下结果,其中绿线是填充的增加。这比硬编码值更安全,因为不同的设备可以对复选框使用不同的可绘制对象。
更新 - 正如人们最近在下面的答案中提到的,这种行为在 Jelly Bean (4.2) 中明显发生了变化。您的应用程序需要检查其运行的版本,并使用适当的方法。
对于 4.3+,只需设置 padding_left。详情请参阅 htafoya 的回答。
I hate to answer my own question, but in this case I think I need to. After checking it out, @Falmarri was on the right track with his answer. The problem is that Android's CheckBox control already uses the android:paddingLeft property to get the text where it is.
The red line shows the paddingLeft offset value of the entire CheckBox
If I just override that padding in my XML layout, it messes up the layout. Here's what setting paddingLeft="0" does:
Turns out you can't fix this in XML. You have do it in code. Here's my snippet with a hardcoded padding increase of 10dp.
This gives you the following, where the green line is the increase in padding. This is safer than hardcoding a value, since different devices could use different drawables for the checkbox.
UPDATE - As people have recently mentioned in answers below, this behavior has apparently changed in Jelly Bean (4.2). Your app will need to check which version its running on, and use the appropriate method.
For 4.3+ it is simply setting padding_left. See htafoya's answer for details.
鉴于@DougW响应,我管理版本的方法更简单,我添加到我的复选框视图中:
在两个值文件夹中找到尺寸:
values
values-v17 (4.2 JellyBean)< /strong>
我有一个自定义检查,使用dps给你最好的选择。
Given @DougW response, what I do to manage version is simpler, I add to my checkbox view:
where the dimen is found in two values folders:
values
values-v17 (4.2 JellyBean)
I have a custom check, use the dps to your best choice.
使用属性
android:drawableLeft
而不是android:button
。为了设置可绘制对象和文本之间的填充,请使用android:drawablePadding
。要定位可绘制对象,请使用android:paddingLeft
。Use attribute
android:drawableLeft
instead ofandroid:button
. In order to set padding between drawable and text useandroid:drawablePadding
. To position drawable useandroid:paddingLeft
.Android 4.2 Jelly Bean (API 17) 将文本 paddingLeft 从 ButtonDrawable 中放置(ints 右边缘)。它也适用于 RTL 模式。
在 4.2 之前,paddingLeft 忽略了buttonDrawable - 它是从CompoundButton 视图的左边缘获取的。
您可以通过 XML 来解决它 - 在旧版 Android 上将 paddingLeft 设置为 buttonDrawable.width + requiredSpace。仅在 API 17 及更高版本上将其设置为 requiredSpace。例如,使用维度资源并覆盖 value-v17 资源文件夹。
该更改是通过 android.widget.CompoundButton.getCompoundPaddingLeft() 引入的;
Android 4.2 Jelly Bean (API 17) puts the text paddingLeft from the buttonDrawable (ints right edge). It also works for RTL mode.
Before 4.2 paddingLeft was ignoring the buttonDrawable - it was taken from the left edge of the CompoundButton view.
You can solve it via XML - set paddingLeft to buttonDrawable.width + requiredSpace on older androids. Set it to requiredSpace only on API 17 up. For example use dimension resources and override in values-v17 resource folder.
The change was introduced via android.widget.CompoundButton.getCompoundPaddingLeft();
是的,您可以通过添加内边距来添加内边距。
android:padding=5dp
Yes, you can add padding by adding padding.
android:padding=5dp
如果您想要一个没有代码的干净设计,请使用:
技巧是将
android:drawableLeft
的颜色设置为透明,并为android:drawablePadding
分配一个值。此外,透明度允许您在任何背景颜色上使用此技术,而不会产生副作用(例如颜色不匹配)。If you want a clean design without codes, use:
The trick is to set colour to transparent for
android:drawableLeft
and assign a value forandroid:drawablePadding
. Also, transparency allows you to use this technique on any background colour without the side effect - like colour mismatch.API 17及以上版本,您可以使用:
API 16及以下版本,您可以使用:
API 17 and above, you can use:
API 16 and below, you can use:
就我而言,我使用 XML 中的以下 CheckBox 属性解决了这个问题:
*
*
In my case I solved this problem using this following CheckBox attribute in the XML:
*
*
简单的解决方案,在 CheckBox 属性中添加此行,将 10dp 替换为您想要的间距值
Simple solution, add this line in the CheckBox properties, replace 10dp with your desired spacing value
我不知道大家,但我测试了
它很适合我。
I don't know guys, but I tested
<CheckBox android:paddingLeft="8mm"
and only moves the text to the right, not entire control.It suits me fine.
对于复选标记和文本之间的空间使用:
但它变得超过10dp,因为复选标记周围包含填充(大约5dp)。如果您想删除内边距,请参阅如何删除 Android CheckBox 周围的内边距:
For space between the check mark and the text use:
But it becomes more than 10dp, because the check mark contains padding (about 5dp) around. If you want to remove padding, see How to remove padding around Android CheckBox:
为什么不直接扩展 Android CheckBox 以获得更好的填充呢?这样,您不必每次使用 CheckBox 时都在代码中修复它,您只需使用固定的 CheckBox 即可。
首先扩展 CheckBox:
在 xml 中创建扩展的 CheckBox,而不是创建普通的 CheckBox
Why not just extend the Android CheckBox to have better padding instead. That way instead of having to fix it in code every time you use the CheckBox you can just use the fixed CheckBox instead.
First Extend CheckBox:
Second in your xml instead of creating a normal CheckBox create your extended one
对于我来说,在 Android 9 API 28 上,将 minHeight 和 minWidth 设置为 0dp 是最干净、最直接的解决方案:
Setting minHeight and minWidth to
0dp
was the cleanest and directest solution for me on Android 9 API 28:我刚刚得出结论:
如果您有自定义可绘制对象,则覆盖 CheckBox 并添加此方法:
或者如果您使用系统可绘制对象,则添加此方法:
感谢您的回答:)
I just concluded on this:
Override CheckBox and add this method if you have a custom drawable:
or this if you use the system drawable:
Thanks for the answer :)
只需要在 xml 文件中有一个参数
only you need to have one parameter in xml file
这种行为在 Jelly Bean 中似乎有所改变。 paddingLeft 技巧添加了额外的填充,使文本看起来太靠右。还有人注意到这一点吗?
This behavior appears to have changed in Jelly Bean. The paddingLeft trick adds additional padding, making the text look too far right. Any one else notice that?
如果有人需要在可绘制对象周围填充试试这个
if some one need padding around drawable try this
如果您有复选框或单选按钮的自定义图像选择器,则必须设置相同的按钮和背景属性,如下所示:
您可以使用背景属性控制复选框或单选按钮填充的大小。
If you have custom image selector for checkbox or radiobutton you must set same button and background property such as this:
You can control size of checkbox or radio button padding with background property.
我认为这可以帮助你
I think this can help you
如果您要创建自定义按钮,例如请参阅 更改复选框外观教程
然后只需增加宽度btn_check_label_background.9.png 通过在图像中心添加一列或两列透明像素来实现;保留 9 块标记不变。
If you are creating custom buttons, e.g. see change look of checkbox tutorial
Then simply increase the width of btn_check_label_background.9.png by adding one or two more columns of transparent pixels in the center of the image; leave the 9-patch markers as they are.
我所做的是在(相对)
Layout
内有一个TextView
和一个CheckBox
。TextView
显示我希望用户看到的文本,而CheckBox
没有任何文本。这样,我就可以在任意位置设置CheckBox
的位置/填充。What I did, is having a
TextView
and aCheckBox
inside a (Relative)Layout
. TheTextView
displays the text that I want the user to see, and theCheckBox
doesn't have any text. That way, I can set the position / padding of theCheckBox
wherever I want.我在 Galaxy S3 mini (android 4.1.2) 上遇到了同样的问题,我只是简单地扩展了我的自定义复选框 AppCompatCheckBox 而不是 CheckBox。现在它工作得很好。
I had the same problem with a Galaxy S3 mini (android 4.1.2) and I simply made my custom checkbox extend AppCompatCheckBox instead of CheckBox. Now it works perfectly.
@CoolMind 有很好的方法,但它无法通过
android:paddingLeft
在复选框开头添加空格,而是使用这种方式android:drawablePadding
应该可以帮助你@CoolMind has the nice way but it couldn't add the space at the beginning of checkbox by
android:paddingLeft
, instead use this wayandroid:drawablePadding
should help you您需要获取正在使用的图像的大小,以便将填充添加到该大小。在 Android 内部,他们获取您在 src 上指定的可绘制对象,然后使用其大小。因为它是一个私有变量并且没有 getter,所以你无法访问它。此外,您无法获取 com.android.internal.R.styleable.CompoundButton 并从那里获取可绘制对象。
因此,您需要创建自己的样式(即 custom_src),或者您可以直接将其添加到 RadioButton 的实现中:
You need to get the size of the image that you are using in order to add your padding to this size. On the Android internals, they get the drawable you specify on src and use its size afterwards. Since it's a private variable and there are no getters you cannot access to it. Also you cannot get the com.android.internal.R.styleable.CompoundButton and get the drawable from there.
So you need to create your own styleable (i.e. custom_src) or you can add it directly in your implementation of the RadioButton:
由于您可能为
android:button
属性使用可绘制选择器,因此您需要添加android:constantSize="true"
和/或指定一个默认可绘制,如下所示:您需要在复选框 xml 中指定
android:paddingLeft
属性。缺点:
在布局编辑器中,您将在 api 16 及以下版本的复选框下显示文本,在这种情况下,您可以通过创建自定义复选框类来修复它,例如 建议,但适用于 api 级别 16。
理由:
这是一个错误,因为
StateListDrawable#getIntrinsicWidth()
调用是在CompoundButton
内部使用,但它可能返回<如果没有当前状态且未使用常量大小,则为 0 值。
As you probably use a drawable selector for your
android:button
property you need to addandroid:constantSize="true"
and/or specify a default drawable like this:After that you need to specify
android:paddingLeft
attribute in your checkbox xml.Cons:
In the layout editor you will the text going under the checkbox with api 16 and below, in that case you can fix it by creating you custom checkbox class like suggested but for api level 16.
Rationale:
it is a bug as
StateListDrawable#getIntrinsicWidth()
call is used internally inCompoundButton
but it may return< 0
value if there is no current state and no constant size is used.要解决这个问题,您所要做的就是将
android:singleLine="true"
添加到 android xml 布局中的checkBox
中:并且不会以编程方式添加任何特殊内容。
All you have to do to overcome this problem is to add
android:singleLine="true"
to thecheckBox
in your android xml layout:and nothing special will be added programmatically.
当我使用选择器中的自己的可绘制对象时,复选框图像重叠,我已使用以下代码解决了此问题:
感谢 Alex Semeniuk
Checkbox image was overlapping when I used my own drawables from selector, I have solve this using below code :
Thanks to Alex Semeniuk
我通过更改图像最终解决了这个问题。
刚刚在 png 文件中添加了额外的透明背景。
该解决方案在所有 API 上都表现出色。
I end up with this issue by changing the images.
Just added extra transparent background in png files.
This solution works excellent on all the APIs.
也许为时已晚,但我已经创建了实用方法来管理这个问题。
只需将此方法添加到您的实用程序中:
并像这样使用:
或像这样:
Maybe it is to late, but I've created utility methods to manage this issue.
Just add this methods to your utils:
And use like this:
or like this: