Android 4.2 RadioButton android: ошибка drawableLeft?

Android 4.2 не отображает RadioButton правильно, когда используется android: drawableLeft. DrawableRight в порядке.

Выводимая слева левая сторона перекрывает графический элемент Радио кнопки. И, по крайней мере, Android 2.2-4.1, похоже, в порядке с drawableLeft.

Вы знаете об обходном пути для этого? Настройка drawableLeft программно не помогла решить эту проблему.

4.2 Проблема с Android

4.2 выпуск

4.1 Android отображает это правильно (по крайней мере, Android 2.2-4.0 тоже делает это правильно)

4.1 верно

Формат XML для Android:

<RadioButton android:id="@+id/radio_cloud_dropbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:drawableLeft="@drawable/dropbox_logo" android:checked="true" android:text="@string/lbl_cloud_dropbox" /> 

Вы можете использовать на переключателе:

Установите кнопку @null и выставимую левую кнопку, чтобы ваша кнопка:

  <RadioGroup android:id="@+id/hn_radio_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <RadioButton android:id="@+id/rb_Select_by_proposal" style="@style/RadioButtonText" android:checked="true" android:tag="1" android:text="@string/select_by_proposal" /> <RadioButton android:id="@+id/rb_Select_by_first_letter" style="@style/RadioButtonText" android:tag="2" android:text="@string/select_by_first_letter" /> </RadioGroup> 

И это стиль:

 <style name="RadioButtonText"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:button">@null</item> <item name="android:drawableLeft">@drawable/radio_selector</item> <item name="android:drawablePadding">10dp</item> </style> 

Для пробела между кнопкой и текстом используйте:

  <item name="android:drawablePadding">10dp</item> 

Это, скорее всего, продукт новой поддержки направления макетов, который был добавлен на платформу в Android 4.2 (т. Е. Для поддержки макета влево-вправо или вправо-влево). Это влияет на то, как они размещают содержимое слева и справа. В чем ваш атрибут android:targetSdkVersion ? Технически, я считаю, что если он установлен на 16 или ниже, эти изменения макета должны быть отключены по умолчанию, даже если ваш локаль в противном случае разрешил бы их.

Я бы рекомендовал подавать ошибку на http://b.android.com , потому что в режиме RTL я ожидал бы, что кнопка может быть на другой стороне. В то же время вы можете попробовать форсировать направление макета, добавив атрибут layoutDirection в свой TextView и заставляя его быть LTR, чтобы он выглядел так, как вы ожидаете. Вы также можете вызывать это из кода Java с помощью setLayoutDirection()

Моим временным решением этой ошибки было заменить родительский макет TableLayout на TableRow (s), содержащий RadioButton и TextView . Хотя есть и другие решения.

 <TableLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TableRow android:onClick="onDropboxClick" > <RadioButton android:id="@+id/radio_cloud_dropbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:onClick="onDropboxClick" /> <TextView android:drawableLeft="@drawable/cloud_logo_dropbox" android:gravity="center_vertical" android:text="Dropbox" /> </TableRow> <TableRow android:onClick="onGoogleDriveClick" > <RadioButton android:id="@+id/radio_cloud_google_drive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:onClick="onGoogleDriveClick" /> <TextView android:drawableLeft="@drawable/cloud_logo_google_drive" android:gravity="center_vertical" android:text="Google Drive" /> </TableRow> </TableLayout> 

Однако, поскольку RadioGroup не может использоваться с вложенными макетами, выбор / RadioGroup состояния должен выполняться вручную в связанной деятельности в методах обработчика событий:

 public void onDropboxClick(View view) { checkRadio(R.id.radio_cloud_dropbox); } public void onGoogleDriveClick(View view) { checkRadio(R.id.radio_cloud_google_drive); } private void checkRadio(int radioId) { if (radioId == R.id.radio_cloud_dropbox) { dropboxRadio.setChecked(true); googleDriveRadio.setChecked(false); } else if (radioId == R.id.radio_cloud_google_drive) { dropboxRadio.setChecked(false); googleDriveRadio.setChecked(true); } } 

Это, похоже, исправлено в Android 4.2.2.