Есть ли простой способ добавить дополнение между флажком в элементе управления CheckBox и связанным с ним текстом?
Я не могу просто добавить ведущие пробелы, потому что моя метка многострочная.
As-is, текст слишком близко к флажку:
Есть ли простой способ добавить дополнение между флажком в элементе управления CheckBox и связанным с ним текстом?
Я не могу просто добавить ведущие пробелы, потому что моя метка многострочная.
As-is, текст слишком близко к флажку:
Я ненавижу отвечать на свой вопрос, но в этом случае я думаю, что мне нужно. После проверки, @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());
Это дает вам следующее: зеленая линия - это увеличение отступов. Это безопаснее, чем hardcoding значение, так как различные устройства могут использовать различные чертежи для этого флажка.
ОБНОВЛЕНИЕ. Как недавно упоминалось в ответах ниже, это поведение, по-видимому, изменилось в желе 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
. Чтобы установить отступы между возможностью рисования и текстом, используйте 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.
Первое расширение 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:
*
Android: paddingLeft = "@DIMEN/activity_horizontal_margin"
*
API 17 и выше, вы можете использовать:
Android: paddingStart = "24dp"
API 16 и ниже, вы можете использовать:
Android: paddingLeft = "24dp"
Я только что заключил в этом:
Переопределите 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;
}
}
Спасибо за ответ:)
Такое поведение, похоже, изменилось в желе 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" />
Вы можете управлять размером флажка или дополнением кнопки с фоновым свойством.
только вам нужно иметь один параметр в XML файле
android:paddingLeft="20dp"
Если вы создаете пользовательские кнопки, например. см. изменить внешний вид окна флажка
Затем просто увеличьте ширину btn_check_label_background.9.png, добавив один или два столбца прозрачных пикселей в центре изображения; оставьте маркеры с 9 патчами, как они есть.
То, что я сделал, имеет TextView
и CheckBox
внутри (Относительно) Layout
. TextView
отображает текст, который я хочу видеть пользователю, а CheckBox
не имеет никакого текста. Таким образом, я могу установить положение/дополнение CheckBox
везде, где захочу.
У меня была та же проблема с 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;
}
}
Как вы, вероятно, используете переносимый селектор для вашего свойства 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
в вашем макете 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"/>
и ничего особенного не будет добавлено программно.
Изображение флажка перекрывалось, когда я использовал свои собственные чертежи из селектора, я решил это с помощью кода ниже:
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.
Возможно, это поздно, но я создал утилиты для решения этой проблемы.
Просто добавьте эти методы в ваши 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);
Вместо того, чтобы корректировать текст для флажка, я сделал следующее, и он работал у меня для всех устройств. 1) В XML добавьте флажок и текстовое представление в соседние друг с другом; сохраняя некоторое расстояние. 2) Установите размер текста флажка в 0sp. 3) Добавьте относительный текст в это текстовое окно рядом с этим флажком.
<CheckBox android:drawablePadding="16dip"
- Прокладка между чертежами и текстом.