Есть ли простой способ добавить отступ между флажком в элементе управления CheckBox и соответствующим текстом?
Я не могу просто добавить начальные пробелы, потому что мой ярлык многострочный.
Как есть, текст слишком близко к флажку:
Есть ли простой способ добавить отступ между флажком в элементе управления CheckBox и соответствующим текстом?
Я не могу просто добавить начальные пробелы, потому что мой ярлык многострочный.
Как есть, текст слишком близко к флажку:
Ответы:
Ненавижу отвечать на свой вопрос, но в этом случае думаю, что мне нужно. После проверки @Falmarri был на правильном пути со своим ответом. Проблема в том, что элемент управления Android CheckBox уже использует свойство android: paddingLeft, чтобы получить текст, где он находится.
Красная линия показывает значение смещения paddingLeft всего CheckBox
Если я просто переопределяю это заполнение в моем макете 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>
Значения-v17 (4,2 JellyBean)
<resources>
<dimen name="padding_checkbox">10dp</dimen>
</resources>
У меня есть пользовательская проверка, используйте дпс на ваш лучший выбор.
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) помещает текст paddingLeft из buttonDrawable (отступает правый край). Это также работает для режима RTL.
До версии 4.2 paddingLeft игнорировал buttonDrawable - он был взят с левого края представления CompoundButton.
Вы можете решить это с помощью XML - установите paddingLeft в buttonDrawable.width + requiredSpace на старых андроидах. Установите его для requiredSpace только на API 17 и выше. Например, используйте ресурсы измерений и переопределите их в папке ресурсов 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
. Кроме того, прозрачность позволяет использовать эту технику на любом цвете фона без побочных эффектов, таких как несоответствие цвета.
API 17 и выше, вы можете использовать:
андроид: paddingStart = "24dp"
API 16 и ниже, вы можете использовать:
андроид: paddingLeft = "24dp"
В моем случае я решил эту проблему, используя следующий атрибут CheckBox в XML:
*
андроид: paddingLeft = "@ DIMEN / activity_horizontal_margin"
*
Простое решение, добавьте эту строку в свойствах CheckBox , замените 10dp на желаемое значение расстояния
android:paddingLeft="10dp"
Я не знаю, ребята, но я проверял
<CheckBox android:paddingLeft="8mm"
и только перемещает текст вправо, а не весь контроль.
Меня это устраивает нормально.
Почему бы просто не расширить 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" />
Я только что сделал вывод об этом:
Переопределите 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;
}
}
или это если вы используете систему 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) {
final float scale = this.getResources().getDisplayMetrics().density;
return compoundPaddingLeft + (drawable != null ? (int)(10.0f * scale + 0.5f) : 0);
} else {
return compoundPaddingLeft;
}
}
Спасибо за ответ :)
Это поведение изменилось в Jelly Bean. Трюк paddingLeft добавляет дополнительные отступы, делая текст слишком правым. Кто-нибудь еще заметил это?
Для пробела между галочкой и текстом используйте:
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" />
Вы можете контролировать размер флажка или переключателя с помощью свойства background.
Если вы создаете пользовательские кнопки, например, см. Изменение внешнего вида учебника по флажкам
Затем просто увеличьте ширину btn_check_label_background.9.png, добавив еще один или два столбца прозрачных пикселей в центре изображения; оставьте маркеры с 9 участками как есть.
У меня была такая же проблема с 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
вашему андроиду макета 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);
Спасибо Алексею Семенюку
Я заканчиваю с этой проблемой, изменяя изображения. Просто добавлен дополнительный прозрачный фон в 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"
- Обивка между рисованными объектами и текстом.
TextView
сdrawableLeft
и использовать,drawablePadding
чтобы дать место для текста. В коде просто переключать выбранные и невыбранные состояния.