Android - расстояние между CheckBox и текстом - PullRequest
238 голосов
/ 28 октября 2010

Существует ли простой способ добавить заполнение между флажком в элементе управления CheckBox и соответствующим текстом?

Я не могу просто добавить начальные пробелы, поскольку моя метка многострочная.

Как есть, текст слишком близко к флажку: alt text

Ответы [ 27 ]

323 голосов
/ 28 октября 2010

Я не хочу отвечать на свой вопрос, но в этом случае я думаю, что мне нужно.После проверки @Falmarri был на правильном пути со своим ответом.Проблема заключается в том, что элемент управления Android CheckBox уже использует свойство android: paddingLeft, чтобы получить текст, где он находится.

Красная линия показывает значение смещения paddingLeft всего CheckBox

alt text

Если я просто переопределю это заполнение в моем макете XML, это испортит макет.Вот что делает параметр paddingLeft = "0":

alt text

Оказывается, вы не можете исправить это в 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());

Это дает вам следующее, где зеленая линия - это увеличение заполнения.Это безопаснее, чем жесткое кодирование значения, поскольку разные устройства могут использовать разные рисованные элементы для этого флажка.

alt text

ОБНОВЛЕНИЕ - Как люди недавно упоминали в ответах ниже, это поведение, очевидно, изменилосьв желейных бобах (4.2).Ваше приложение должно будет проверить, на какой версии оно работает, и использовать соответствующий метод.

Для 4.3+ это просто установка padding_left.Подробности смотрите в ответе Хтафоя.

125 голосов
/ 29 ноября 2013

Учитывая ответ @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 по вашему выбору.

70 голосов
/ 18 декабря 2012

Используйте атрибут 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"
        />

result

34 голосов
/ 29 июля 2013

Android 4.2 Jelly Bean (API 17) помещает текст paddingLeft из кнопки Drawable (целое число справа).Это также работает в режиме RTL.

До версии 4.2 paddingLeft игнорировал buttonDrawable - он был взят с левого края представления CompoundButton.

Вы можете решить это с помощью XML - установите paddingLeft в buttonDrawable.width + requiredSpace на старых android,Установите его для requiredSpace только на API 17 и выше.Например, используйте ресурсы измерений и переопределите их в папке ресурсов values-v17.

Изменение было внесено с помощью android.widget.CompoundButton.getCompoundPaddingLeft ();

26 голосов
/ 28 октября 2010

Да, вы можете добавить заполнение, добавив заполнение.

android:padding=5dp

19 голосов
/ 06 октября 2013

Если вы хотите чистый дизайн без кодов, используйте:

<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.Кроме того, прозрачность позволяет использовать эту технику на любом цвете фона без побочных эффектов - например, несоответствие цвета.

15 голосов
/ 31 января 2016

API 17 и выше, вы можете использовать:

андроида: paddingStart = "24dp"

API 16 и ниже, вы можете использовать:

андроида: paddingLeft = "24dp"

14 голосов
/ 23 февраля 2016

В моем случае я решил эту проблему с помощью следующего атрибута CheckBox в XML:

*

android: paddingLeft = "@ dimension / activity_hor Horizontal_margin"

*

12 голосов
/ 07 октября 2015

Простое решение, добавьте эту строку в свойствах CheckBox , замените 10dp на желаемое значение интервала

android:paddingLeft="10dp"
10 голосов
/ 15 июня 2012

Почему бы просто не расширить 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" />
...