Android - Интервал между CheckBox и текстом

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

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

As-is, текст слишком близко к флажку: alt text

Ответ 1

Я ненавижу отвечать на свой вопрос, но в этом случае я думаю, что мне нужно. После проверки, @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());

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

alt text

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

Ответ 2

Учитывая ответ @DougW, то, что я делаю для управления версией, проще, я добавляю к своему представлению checkbox:

android:paddingLeft="@dimen/padding_checkbox"

где dimen находится в двух папках значений:

<сильные > значения

<resources>

    <dimen name="padding_checkbox">25dp</dimen>

</resources>

значения-v17 (4.2 JellyBean)

<resources>

    <dimen name="padding_checkbox">10dp</dimen>

</resources>

У меня есть пользовательская проверка, используйте dps для вашего наилучшего выбора.

Ответ 3

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

Ответ 4

Android 4.2 Jelly Bean (API 17) помещает текст paddingLeft из кнопки buttonDrawable (правая граница ints). Он также работает в режиме RTL.

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

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

Изменение было введено через android.widget.CompoundButton.getCompoundPaddingLeft();

Ответ 5

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

android:padding=5dp

Ответ 6

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

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

Ответ 7

Почему бы просто не расширить Android CheckBox, чтобы вместо этого было удобнее. Таким образом, вместо того, чтобы исправлять его в коде каждый раз, когда вы используете 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" />

Ответ 8

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

android:paddingLeft="10dp"

Ответ 9

Я не знаю парней, но я тестировал

<CheckBox android:paddingLeft="8mm" и только перемещает текст вправо, а не весь элемент управления.

Мне это подходит.

Ответ 10

В моем случае я решил эту проблему, используя этот атрибут CheckBox в XML:

*

Android: paddingLeft = "@DIMEN/activity_horizontal_margin"

*

Ответ 11

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

Android: paddingStart = "24dp"

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

Android: paddingLeft = "24dp"

Ответ 12

Я только что заключил в этом:

Переопределите CheckBox и добавьте этот метод, если у вас есть пользовательский drawable:

@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;
    }

}

Спасибо за ответ:)

Ответ 13

Такое поведение, похоже, изменилось в желе Bean. Трюк paddingLeft добавляет дополнительное дополнение, делая текст слишком далеко справа. Кто-нибудь еще заметил, что?

Ответ 14

<CheckBox
        android:paddingRight="12dip" />

Ответ 15

Если у вас есть настраиваемый селектор изображений для флажка или радиообмена, вы должны установить одинаковое свойство кнопки и фона, например:

            <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" />

Вы можете управлять размером флажка или дополнением кнопки с фоновым свойством.

Ответ 16

только вам нужно иметь один параметр в XML файле

android:paddingLeft="20dp"

Ответ 17

Если вы создаете пользовательские кнопки, например. см. изменить внешний вид окна флажка

Затем просто увеличьте ширину btn_check_label_background.9.png, добавив один или два столбца прозрачных пикселей в центре изображения; оставьте маркеры с 9 патчами, как они есть.

Ответ 18

То, что я сделал, имеет TextView и CheckBox внутри (Относительно) Layout. TextView отображает текст, который я хочу видеть пользователю, а CheckBox не имеет никакого текста. Таким образом, я могу установить положение/дополнение CheckBox везде, где захочу.

Ответ 19

У меня была та же проблема с Galaxy S3 mini (android 4.1.2), и я просто сделал свой собственный флажок, добавив AppCompatCheckBox вместо из CheckBox. Теперь он отлично работает.

Ответ 20

Вам нужно получить размер изображения, которое вы используете, чтобы добавить дополнение к этому размеру. На внутренности Android они получают возможность вытягивания, которую вы указываете в src, и затем используете ее размер. Так как это приватная переменная, и нет никаких геттеров, к которой вы не можете получить доступ. Также вы не можете получить 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;
    }
}

Ответ 21

Как вы, вероятно, используете переносимый селектор для вашего свойства 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>

После этого вам нужно указать атрибут android:paddingLeft в вашем флажке xml.

Минусы:

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

Обоснование:

это ошибка, так как вызов StateListDrawable#getIntrinsicWidth() используется внутри CompoundButton, но может возвращать значение < 0, если нет текущего состояния и не используется постоянный размер.

Ответ 22

Все, что вам нужно сделать, чтобы преодолеть эту проблему, - это добавить android:singleLine="true" в checkBox в вашем макете xroid.

<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"/>

и ничего особенного не будет добавлено программно.

Ответ 23

Изображение флажка перекрывалось, когда я использовал свои собственные чертежи из селектора, я решил это с помощью кода ниже:

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);

Благодаря Алексею Семенюку

Ответ 24

Я получаю эту проблему, меняя изображения. Просто добавлен дополнительный прозрачный фон в png файлах. Это решение отлично работает на всех API.

Ответ 25

Возможно, это поздно, но я создал утилиты для решения этой проблемы.

Просто добавьте эти методы в ваши utils:

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);

Ответ 26

Вместо того, чтобы корректировать текст для флажка, я сделал следующее, и он работал у меня для всех устройств. 1) В XML добавьте флажок и текстовое представление в соседние друг с другом; сохраняя некоторое расстояние. 2) Установите размер текста флажка в 0sp. 3) Добавьте относительный текст в это текстовое окно рядом с этим флажком.

Ответ 27

<CheckBox android:drawablePadding="16dip" - Прокладка между чертежами и текстом.