android - API 21/22 及以下版本的 RadioButton 中断的自定义可绘制对象

标签 android xml android-studio android-layout

我已经为 AppCompatButton 创建了自定义可绘制对象,它在 API 级别 23 及更高级别上工作得非常好。

这是自定义绘图。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_shortAnimTime" android:exitFadeDuration="@android:integer/config_shortAnimTime">
    <item android:drawable="@drawable/background_radio_checked" android:state_checked="true" />
    <item android:drawable="@drawable/background_radio_unchecked" android:state_checked="false" />
</selector>

background_radio_checked -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:left="-8dp"
        android:right="-8dp"
        android:top="-8dp">
        <shape>
            <solid android:color="#FFF1EEFF" />
            <stroke
                android:width="1dp"
                android:color="@color/color_ask_question" />
        </shape>
    </item>

    <item
        android:bottom="@dimen/screen_margin_half"
        android:drawable="@drawable/ic_add_filled_24dp"
        android:gravity="start|center_vertical"
        android:left="@dimen/screen_margin_half_plus_four"
        android:right="@dimen/screen_margin_half"
        android:top="@dimen/screen_margin_half" />
</layer-list>

background_radio_unchecked -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <stroke
                android:width="1dp"
                android:color="@color/color_employer_divider" />
            <solid android:color="#F2F2F2" />
            <corners android:topLeftRadius="@dimen/screen_margin_half_half_half" />
        </shape>
    </item>
    <item
        android:bottom="@dimen/screen_margin_half"
        android:drawable="@drawable/ic_add_empty_24dp"
        android:gravity="start|center_vertical"
        android:left="@dimen/screen_margin_half_plus_four"
        android:right="@dimen/screen_margin_half"
        android:top="@dimen/screen_margin_half" />
</layer-list>

使用的 drawable 是 SVG,高度宽度为 24dp。

它在 API 23+ 上的表现 enter image description here

但同样的事情在 API 级别 21 上看起来很糟糕。

drawable 中使用的图像拉伸(stretch)到全宽。 enter image description here

尝试删除动画但结果仍然相同。

不确定我做错了什么或错过了什么。 似乎我正在使用一些仅在 API 23 及更高版本中不可用但不确定是哪一个的属性。

最佳答案

我会自己回答,希望它会帮助别人。

我将这个可绘制对象设置为我的单选按钮的背景,并在按钮属性中传递“@null”。

        <android.support.v7.widget.AppCompatRadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/custom_radio_button_backgorund"
            android:button="@null"
            android:checked="true" />

这行不通,所以我为按钮和背景创建了两个单独的自定义可绘制对象。

对于背景的自定义可绘制对象,我只使用了带有边框、背景颜色、半径等的形状,但没有图标。对于 Button 的自定义可绘制对象,我使用了图标。 在背景和按钮中分配这两个自定义可绘制对象可以在 Lollipop 设备及以上设备中正常工作。

            <android.support.v7.widget.AppCompatButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/custom_radio_background"
                android:button="@drawable/custom_radio_button"
                android:checked="true" />

------------背景的自定义drawable------------

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_shortAnimTime" android:exitFadeDuration="@android:integer/config_shortAnimTime">
    <item android:drawable="@drawable/background_radio_checked_background" android:state_checked="true" />
    <item android:drawable="@drawable/background_radio_unchecked_background" android:state_checked="false" />
</selector>

background_radio_checked_background -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:left="-8dp"
        android:right="-8dp"
        android:top="-8dp">
        <shape>
            <solid android:color="#EBFFF7" />
            <stroke
                android:width="1dp"
                android:color="#118F5D" />
        </shape>
    </item>
</layer-list>

background_radio_unchecked_background -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <stroke
                android:width="1dp"
                android:color="@color/color_employer_divider" />
            <solid android:color="#F2F2F2" />
            <corners android:topRightRadius="@dimen/screen_margin_half_half_half" />
        </shape>
    </item>
</layer-list>

------------按钮的自定义drawable------------

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_shortAnimTime" android:exitFadeDuration="@android:integer/config_shortAnimTime">
    <item android:drawable="@drawable/background_radio_checked_button" android:state_checked="true" />
    <item android:drawable="@drawable/background_radio_unchecked_button" android:state_checked="false" />
</selector>

background_radio_checked_button -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="@dimen/screen_margin_half"
        android:drawable="@drawable/ic_poll_filled_24dp"
        android:gravity="start|center_vertical"
        android:left="@dimen/screen_margin_half_plus_four"
        android:right="@dimen/screen_margin_half"
        android:top="@dimen/screen_margin_half" />
</layer-list>

background_radio_unchecked_button -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="@dimen/screen_margin_half"
        android:drawable="@drawable/ic_poll_empty_24dp"
        android:gravity="start|center_vertical"
        android:left="@dimen/screen_margin_half_plus_four"
        android:right="@dimen/screen_margin_half"
        android:top="@dimen/screen_margin_half" />
</layer-list>

我仍然不确定为什么创建具有图标和边框/背景颜色的单个可绘制对象不适用于 Lollipop 设备。

欢迎对此解决方案提出建议和更正。

关于android - API 21/22 及以下版本的 RadioButton 中断的自定义可绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53910091/

相关文章:

xml - 用 ant 转换 XML

python - XML 解析期间出错

android-studio - Android Studio Arctic Fox 与 JUnit4 不兼容?

java - 错误: Failed to resolve ExpandableLayout

android - 如何使用Android预定义常量在xml布局文件中绑定(bind)数据

android - Android NDK(libgcc_real.a)上 '__aeabi_ul2f'的多个定义

java - 使用java创建xml

android - 使用 gradle 4.6 通过终端编译 Android 项目时出错

java - 异步任务流程

android - 我什么时候应该在使用 avd 的虚拟设备中使用主机 gpu 和快照?