Додати поле між RadioButton та його міткою в Android?


88

Чи можна додати трохи простору між RadioButton і етикеткою, використовуючи вбудовані компоненти Android? За замовчуванням текст виглядає трохи стиснутим.

<RadioButton android:id="@+id/rb1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="My Text"/>

Я спробував кілька речей:

  1. Вказівка ​​поля та відступів, здається, додає простір навколо всього елемента (кнопки та тексту разом). Це має сенс, але робить не те, що мені потрібно.

  2. Створення користувацького малюваного за допомогою XML із зазначенням зображень для перевіреного та неперевіреного станів, а потім додавання декількох додаткових пікселів праворуч від кожного зображення. Це має спрацювати, але зараз ви виходите за межі інтерфейсу за замовчуванням. (Не кінець світу, але не ідеальний)

  3. Додайте додаткові пробіли на початок кожної мітки. Здається, Android обробляє провідний пробіл, як у "My String", але вказівка ​​Unicode U + 00A0, як у "\ u00A0My String", робить свою справу. Це працює, але, здається, це трохи брудно.

Є якісь кращі рішення?

Відповіді:


120

Для кожного, хто читає це зараз, прийнята відповідь призведе до деяких проблем із розміщенням на новіших API, що спричинить занадто велике заповнення.

На API <= 16 ви можете встановити paddingLeftна перемикачі, щоб встановити відступ відносно меж перегляду перемикача. Крім того, фон патча дев'ять також змінює межі подання щодо виду.

На API> = 17 paddingLeft(або paddingStart) по відношенню до перемикача, який можна малювати. Те саме стосується приблизно патча дев'ять. Щоб краще проілюструвати відмінності підбивання, див. Доданий знімок екрана.

Якщо ви перекопаєте код, ви знайдете новий метод в API 17, який називається getHorizontalOffsetForDrawables . Цей метод викликається при обчисленні лівого заповнення перемикача (отже, додатковий простір, проілюстрований на малюнку).

TL; DR Просто використовуйте, paddingLeftякщо ваш minSdkVersion>> 17. Якщо ви підтримуєте API <= 16, у вас повинен бути стиль перемикача для мінімального SDK, який ви підтримуєте, та інший стиль для API 17+.

об'єднати скріншоти, що відображають ліві відступи між версіями API


2
api 17 is android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
KarenAnne

11
Найкращий спосіб зробити це за допомогою каталогу "values-v17"; помістіть свій вимір API 17+ у ресурс xml там, а стандартний для 16 і нижче - просто "значення".
Акт

15
Вражаюче, як розробники / керівництво Google ставляться до нас, як зазвичай. Вони роблять все, що хочуть, коли завгодно. Послідовність і цілісність для них нічого не означають.
Яр

66

Не впевнені, чи це вирішить вашу проблему, але чи ви пробували властивість радіокнопки "Заповнення ліворуч" зі значенням 50dip або більше


2
Це працює, і 50dip потрібно, щоб покрити ширину за замовчуванням, яку можна малювати. Спочатку я використав 20dip, і текст перемістився вліво! Це тому, що точка кріплення не є правим краєм висувного; це лівий край малюнка.
Роберт Клейпул,

58

Я спробував кілька способів і закінчив, що цей правильно працює як на емуляторі, так і на пристроях:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: фон повинен бути прозорим, оскільки на api10 здається, що є фон із внутрішніми прокладками (не пробувався з іншими apis, але рішення працює і на інших)
  • android: кнопка повинна бути нульовою, оскільки відступи не працюватимуть належним чином
  • android: drawableLeft потрібно вказати замість android: button
  • android: drawablePadding - це простір, який буде знаходитись між вашим drawable та текстом

4
Найкраща відповідь! Ви також можете встановити android: background = "@ null" і виглядатиме так, як ви заявили, без відступів.
saiyancoder

2
коли я встановлюю android: button = "@ null", перемикач не перевіряється (клацне). Я роблю щось не так. будь ласка допомога stackoverflow.com/questions/28052820 / ...
Shirish Herwade

@Shirish це рішення не має нічого спільного з тим, що на вашій кнопці не натискають. Я просто реалізував його, і на нього клацнули.
Яр

Дякую за рішення!
Вімалатітан Раджасекаран

32

Додати маржу між радіокнопкою його етикеткою на paddingLeft :

android:paddingLeft="10dip"

Просто встановіть власну підкладку .

XML-властивість RadioButton.

<RadioButton
    android:id="@+id/radHighest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/YourImageResource"
    android:drawablePadding="50dp"
    android:paddingLeft="10dip"
    android:text="@string/txt_my_text"
    android:textSize="12sp" />

Готово


22

Використовуйте такі атрибути XML. У мене це спрацювало

Для API <= 16 використання

android:paddingLeft="16dp"

Для API> = 17 використання

android:paddingStart="@16dp"

Наприклад:

<android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/popularityRadioButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:paddingEnd="@dimen/radio_button_text"
        android:paddingLeft="@dimen/radio_button_text"
        android:paddingRight="@dimen/radio_button_text"
        android:paddingStart="@dimen/radio_button_text"
        android:text="Popularity"
        android:textSize="@dimen/sort_dialog_text_size"
        android:theme="@style/AppTheme.RadioButton" />

введіть тут опис зображення

Далі Докладніше: drawablePaddingатрибут не працює. Це працює, лише якщо ви додали малюнок, який можна малювати у своєму перемикачі. Наприклад, наприклад:

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:button="@null"
    android:drawableEnd="@android:drawable/btn_radio"
    android:drawablePadding="56dp"
    android:drawableRight="@android:drawable/btn_radio"
    android:text="New RadioButton" />

6

Не вдається спробувати це зараз, щоб перевірити, але чи намагалися ви перевірити, чи атрибут android: drawablePadding робить те, що вам потрібно?


1
Хм Спробуй, і, здається, це не впливає на ситуацію. Дякую за пропозицію, це, безумовно, звучить прямо з опису: "Заповнення між малюнками та текстом".
allclaws

4
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());

1

Заповнення між малюнками та текстом. Це буде досягнуто додаванням рядка нижче у файлі xml. android:drawablePadding="@dimen/10dp"


я шукав саме це ... мені дуже допомогло
Ширіш Хервад,

2
@dimen/10dpпогана практика
Влад

0

Я спробував, "android: paddingLeft" буде працювати. paddingLeft впливатиме лише на текст, зберігаючи радіозображення у вихідному положенні.


-1

Здається, "android: paddingLeft" працює коректно лише під Android 4.2.2

Я спробував майже всі версії Android, і це працює лише у версії 4.2.2.


-1

Я використовую інший підхід, який, на мою думку, повинен працювати на всіх версіях API. Замість того, щоб застосовувати відступи, я додаю порожній вигляд між RadioButtons:

<View
        android:layout_width="20dp"
        android:layout_height="1dp" />

Це має дати вам 20dp відступ.


-1

Я прийшов сюди, шукаючи відповіді, і найпростішим способом (трохи подумавши) було додати пробіл на початку самої етикетки ось так

<RadioGroup
     android:orientation="horizontal"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignRight="@+id/btnChangeMode"
     android:layout_marginTop="10dp"
     android:layout_marginBottom="10dp"
     android:layout_below="@+id/view3"
     android:gravity="center|left"
     android:id="@+id/ledRadioGroup">
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" On"
         android:layout_marginRight="6dp"
         android:id="@+id/ledon"
         android:textColor="@color/white" />
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" Off"
         android:layout_marginLeft="6dp"
         android:id="@+id/ledoff"
         android:textColor="@color/white" />

-1

для мене працює:

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true">
            <layer-list>
                <item android:right="5dp">
                    <shape android:paddingLeft="5dp" android:shape="oval">
                     <size android:width="20dp" android:height="20dp" />
                     <solid android:color="@color/blue" />
            </shape>
        </item>
    </layer-list>
</item>
<item android:paddingLeft="5dp" android:state_checked="false">
    <layer-list>
        <item android:right="5dp">
            <shape android:paddingLeft="5dp" android:shape="oval">
                <size android:width="20dp" android:height="20dp" />
                <solid android:color="@color/grey" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

-1
<RadioButton
                android:id="@+id/rb1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:background="@null"
                android:paddingLeft="20dp"
                android:text="1"
                android:textColor="@color/text2"
                android:textSize="16sp"
                android:textStyle="bold" />

Подумайте про те, щоб додати кілька коментарів, щоб пояснити, як це вирішує проблему;)
DeadlyJesus

-1

Ви можете встановити цей код у своєму XML-файлі

<RadioButton
android:id="@+id/rButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="50dp"
android:paddingLeft="10dip"
android:text="@string/your_text" />

або скористайтеся цим у класі активності

radioButton.setPadding(12, 10, 0, 10);

-1

Створіть такий стиль у style.xml

<style name="Button.Radio">

    <item name="android:paddingLeft">@dimen/spacing_large</item>
    <item name="android:textSize">16sp</item>
</style>

Помістіть цей стиль у перемикач

 <RadioButton
                android:id="@+id/rb_guest_busy"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="@string/guest_is_waiting"
                android:textSize="@dimen/font_size_3x_medium"
                android:drawablePadding="@dimen/spacing_large"
                android:textColor="@color/color_text_heading_dark"
                style="@style/Button.Radio"/>

Ви можете змінити будь-який атрибут так само, як кнопка, оскільки вона RadioButton побічно успадковує кнопку.


-1

Я знаю, що це старе питання, але з цим рішенням я нарешті отримав спокій і забув про рівень API.

Ліва сторона вертикальної Радіогрупи з правою стороною вертикального подання тексту.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RadioGroup>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 2"/>
    </LinearLayout>
</LinearLayout>

@Mark Buikema, Абсолютно це не етикетка, але тут працює як етикетка! Якщо вам потрібні мітки кліків, ви можете додати слухачі кліків до TextViews. Я хочу сказати, чи потрібно нам застосовувати макет для кожної версії ОС Android? Я думаю, ні.
Стенлі Коу,

-1

Ви можете спробувати скористатися атрибутом гравітації перемикача.

<RadioButton
                        android:id="@+id/rb_all"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:checked="true"
                        android:gravity="right|center_vertical"
                        android:padding="@dimen/padding_30dp"
                        android:text="@string/filter_inv_all"
                        android:textColor="@color/black"
                        android:textSize="@dimen/text_size_18" />

Це вирівняє текст по самому правому кінці. Перевірте перший радіо на зображенні.

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.