Android - CheckBox和文本之间的间距

289

有没有一种简单的方法可以在CheckBox控件中复选框和相关文本之间添加填充?

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

目前,文本与复选框之间的距离太近了: alt text


1
一个简单的解决方案是使用带有drawableLeftTextView,并使用drawablePadding为文本留出空间。在代码中只需切换选定和未选定状态即可。 - Muhammad Babar
我刚刚注意到一个名为android:drawablePadding的新xml属性,它被用来设置可绘制对象和文本之间的间距。虽然我还没有尝试过,但我认为这是谷歌针对这个问题的“事后补救”。 - Peri Hartman
https://dev59.com/mm855IYBdhLWcg3w_5qm#35572204 - Mohamed Ibrahim
只使用'android:padding="10dp"'对我有效。 - undefined
32个回答

1
如果有人需要在可绘制对象周围加填充,请尝试以下方法。
        <com.google.android.material.checkbox.MaterialCheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:button="@null"
        android:drawableStart="@drawable/button_selector"
        android:padding="@dimen/items_padding" />

1
我所做的是在一个(相对)Layout中放置了一个TextView和一个CheckBoxTextView显示我想让用户看到的文本,而CheckBox没有任何文本。这样,我就可以将CheckBox的位置/填充设置在任何我想要的地方。

1

我曾经遇到过Galaxy S3 mini (android 4.1.2)的同样问题,我只需让我的自定义复选框扩展AppCompatCheckBox而不是CheckBox即可。现在它完美地工作了。


1

如果您正在创建自定义按钮,例如查看更改复选框教程的外观

那么只需通过在图像中心添加一列或两列透明像素来增加btn_check_label_background.9.png的宽度;保留9-patch标记不变。


0
你只需要在你的Android XML布局中的checkBox中添加android:singleLine="true"就可以解决这个问题了。
<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"/>

并且不会以编程方式添加任何特殊内容。


0

当我使用自己的可选择器(drawables from selector)时,复选框图像会重叠,我已经使用以下代码解决了这个问题:

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


0
也许现在有点晚了,但我已经创建了实用方法来解决这个问题。
只需将这些方法添加到您的工具类中:
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);

0

由于您可能会在android:button属性中使用可绘制选择器,因此需要添加android:constantSize="true"和/或像这样指定默认可绘制项:

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

接下来,您需要在复选框的xml中指定android:paddingLeft属性。

缺点:

在布局编辑器中,对于api 16及以下版本,文本将出现在复选框下面,此时您可以通过创建自定义复选框类(如suggested)来解决问题,但仅适用于api级别16。

原因:

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


0

你需要获取所使用的图片大小,以便将填充区域添加到该大小中。在Android内部,它们会获取你在src指定的可绘制对象,并在之后使用其大小。由于它是一个私有变量并且没有getter方法,因此您无法访问它。您也无法获取com.android.internal.R.styleable.CompoundButton并从那里获取可绘制对象。

因此,您需要创建自己的styleable(即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;
    }
}

0

我通过更改图像解决了这个问题。 只是在png文件中添加了额外的透明背景。 这个解决方案在所有API上都非常有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接