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

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

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

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

Solutions Collecting From Web of "Android – Интервал между CheckBox и текстом"

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

ОБНОВЛЕНИЕ – Как недавно упоминалось в ответах ниже, это поведение, по-видимому, изменилось в Jelly Bean (4.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 для вашего наилучшего выбора.

Используйте атрибут android:drawableLeft вместо android:button Чтобы установить отступы между drawable и text, используйте 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 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 ();

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

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

Почему бы просто не расширить Android CheckBox, чтобы вместо этого было удобнее. Таким образом, вместо того, чтобы исправлять его в коде каждый раз, когда вы используете CheckBox, вы можете просто использовать исправленный CheckBox.

First Extend 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 , замените 10dp на требуемое значение расстояния

 android:paddingLeft="10dp" 

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

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

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

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

*

андроид: paddingLeft = "@ DIMEN / activity_horizontal_margin"

*

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

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

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

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

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

Переопределите 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; } } 

Спасибо за ответ 🙂

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

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

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

  <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 патчами, как есть.

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

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

 android:paddingLeft="20dp" 

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

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

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

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

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

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

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

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

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

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

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

<CheckBox android:drawablePadding="16dip" – отступы между чертежами и текстом.