Android 4.2中的单选按钮android:drawableLeft存在问题吗?

8

当使用android:drawableLeft时,Android 4.2不能正确地显示RadioButton。drawableRight没有问题。

左侧的drawable会覆盖Radio按钮图形。至少Android 2.2-4.1似乎对drawableLeft没有问题。

您知道解决此问题的解决方法吗?通过编程方式设置drawableLeft无法解决此问题。

4.2 Android问题

4.2问题

4.1 Android可以正确渲染(至少Android 2.2-4.0也可以正确渲染)

4.1是正确的

此处的Android XML布局代码:

<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" />

我遇到了类似的问题,但在我的情况下,使用canvas.drawText()绘制的文本对齐出现了错误!! - Seraphim's
这是我的问题:https://dev59.com/qWzXa4cB1Zd3GeqPRTzH - Seraphim's
4个回答

6

您可以在单选按钮中使用:

将按钮设置为@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>   

如果需要按钮和文本之间的空格,请使用 "at":

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

这实际上并没有解决问题。自定义标志(Dropbox)在哪里绘制?问题的重点是要同时绘制单选按钮和自定义图像(Dropbox)。 - petrsyn

0

这个问题在Android 4.2.2中似乎已经被修复了。


0

这可能是由于Android 4.2平台中添加的新布局方向支持所导致的产品(即支持从左到右或从右到左布局)。 这也影响了它们如何放置左侧和右侧的可绘制内容。 您的清单属性android:targetSdkVersion设置为什么? 从技术上讲,如果将其设置为16或以下,则即使您的语言环境启用了它们,这些布局更改也应默认禁用。

我建议在http://b.android.com上提交错误报告,因为在RTL模式下,我希望按钮可绘制内容也在另一侧。 同时,您可以尝试通过向TextView添加layoutDirection属性并强制将其设置为LTR来强制布局方向,以便它看起来符合您的期望。 您还可以使用setLayoutDirection()从Java代码中调用此方法。


感谢您的回答。将android:targetSdkVersion从16设置为17并没有帮助。在RadioButton或RadioGroup中使用显式的android:layoutDirection="ltr"也没有改变任何东西。请注意,android:drawableLeft是有问题的,但android:drawableRight可以正常工作。当在组合框中选择API 17时,在Eclipse的“图形布局”中也可以观察到这种错误行为。 - petrsyn
我已经将这个错误提交给了Google,链接为http://code.google.com/p/android/issues/detail?id=40451。 - petrsyn

0
我的临时解决方案是将父级 RadioGroup 布局替换为包含 RadioButton 和 TextView 的 TableLayout 和 TableRow (s)。尽管还有其他解决方案。
<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不能与嵌套布局一起使用,因此在相关联的活动中的事件处理程序方法中必须手动执行选中/取消选中的操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接