是否有一种简单的方法可以在CheckBox控件的复选框和关联的文本之间添加填充?
我不能只添加前导空格,因为我的标签是多行的。
照原样,文本离复选框太近了:
是否有一种简单的方法可以在CheckBox控件的复选框和关联的文本之间添加填充?
我不能只添加前导空格,因为我的标签是多行的。
照原样,文本离复选框太近了:
Answers:
我不想回答自己的问题,但是在这种情况下,我认为我需要回答。检查完后,@ 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"
?即使我更改比例和方向,在这里也能正常工作。您的代码使我在项目列表上的填充值不稳定。
getView()
自定义适配器中使用此解决方案(如果您回收视图),因为填充会不断增加。要解决此问题,我必须使用以下方法: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
我使用的每个CheckBox都使用:check.setPadding(PADDING, check.getPaddingTop() ...
鉴于@DougW的响应,我管理版本的操作更加简单,我将其添加到复选框视图中:
android:paddingLeft="@dimen/padding_checkbox"
在两个值文件夹中找到尺寸的位置:
价值观
<resources>
<dimen name="padding_checkbox">0dp</dimen>
</resources>
values-v17(4.2 JellyBean)
<resources>
<dimen name="padding_checkbox">10dp</dimen>
</resources>
我有一个自定义检查项,请使用dps进行最佳选择。
values-v17
因为该修复程序是在API 17中引入的(根据上述某些帖子)
使用属性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"
和左边距将消失
<item name="android:checkboxStyle">@style/CheckBox</item>
这样,您就定义了一次样式,并且仅引用一次。
Android 4.2 Jelly Bean(API 17)从buttonDrawable(int的右边缘)放置文本paddingLeft。它也适用于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"
。
是的,您可以通过添加填充来添加填充。
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
。此外,透明度还允许您在任何背景颜色上使用此技术,而不会产生副作用-例如颜色不匹配。
就我而言,我使用以下XML中的CheckBox属性解决了此问题:
*
android:paddingLeft =“ @ dimen / activity_horizontal_margin”
*
简单的解决方案,在CheckBox属性中添加此行,将10dp替换为所需的间距值
android:paddingLeft="10dp"
我不认识,但我测试了
<CheckBox android:paddingLeft="8mm"
并且仅将文本移到右侧,而不是整个控件。
很适合我。
为什么不只是扩展Android 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中第二个,而不是创建普通的CheckBox,创建扩展的
<com.whatever.CheckBoxWithPaddingFix
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello there" />
我刚刚得出以下结论:
如果您有一个自定义可绘制对象,请重写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;
}
}
如果使用系统可绘制对象,则为:
@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;
}
}
感谢你的回答 :)
对于复选标记和文本之间的空格,请使用:
android:paddingLeft="10dp"
但它会超过10dp,因为选中标记周围包含填充(大约5dp)。如果要删除填充,请参阅如何删除Android CheckBox周围的填充:
android:paddingLeft="-5dp"
android:layout_marginStart="-5dp"
android:layout_marginLeft="-5dp"
// or android:translationX="-5dp" instead of layout_marginLeft
<CheckBox
android:paddingRight="12dip" />
Bad idea for usability
不,这不对。将复选框和文本视图都置于线性布局中,并使该线性布局可触摸。
如果您具有复选框或单选按钮的自定义图像选择器,则必须设置相同的按钮和背景属性,例如:
<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" />
您可以使用背景属性控制复选框或单选按钮填充的大小。
如果要创建自定义按钮,例如,请参见复选框教程的外观更改
然后,只需在图像中心添加一或两列以上的透明像素,即可增加btn_check_label_background.9.png的宽度;保留9-patch标记不变。
我在Galaxy S3 mini(android 4.1.2)上遇到了同样的问题,我只是使自定义复选框扩展了AppCompatCheckBox 而不是CheckBox。现在,它可以完美运行了。
您需要获取要使用的图像的大小,以便将填充添加到该大小。在Android内部,它们会获得您在src上指定的可绘制对象,然后使用其大小。由于它是一个私有变量,没有getter,因此您无法访问它。另外,您无法获取com.android.internal.R.styleable.CompoundButton并从此处获取可绘制对象。
因此,您需要创建自己的样式(即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;
}
}
由于您可能为android:button
属性使用了drawable选择器,因此需要添加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>
之后,您需要android:paddingLeft
在复选框xml中指定属性。
缺点:
在布局编辑器中,您将使文本位于api 16及以下版本的复选框下方,在这种情况下,您可以通过创建自定义复选框类(如建议的,但针对api级别16)来对其进行修复。
理由:
这是一个错误,因为StateListDrawable#getIntrinsicWidth()
在内部使用了调用,CompoundButton
但是< 0
如果没有当前状态并且未使用常量大小,则可能会返回值。
克服此问题所需要做的就是添加android:singleLine="true"
到checkBox
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"/>
并且不会以编程方式添加任何特殊内容。
当我从选择器中使用自己的可绘制对象时,复选框图像重叠,我已使用以下代码解决了此问题:
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
也许到了很晚,但我已经创建了实用程序方法来管理此问题。
只需将此方法添加到您的工具中:
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);
TextView
withdrawableLeft
和usedrawablePadding
为文本提供空间。在代码中,只需切换选中状态和未选中状态即可。