我可以更改android中的单选按钮,用于API< 21?

时间:2017-09-08 17:50:35

标签: android radio-button material-design selector android-drawable

我正在使用 AppCompatRadioButton ,我想使用我的自定义drawable,我通过下面的代码实现了这个,但它仅适用于API> = 21。

 <android.support.v7.widget.AppCompatRadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

selector_custom_radio_buttons.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:drawable="@drawable/ic_done_single" android:state_checked="false" />
<item android:drawable="@drawable/ic_done_all" android:state_checked="true" />
</selector>

然后我通过活动主题中的样式设置单选按钮选择器

Styles.xml

  <!-- Base application theme. -->
<style name="ThemeNewsFeed" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:radioButtonStyle">@style/MyRadioButtonStyle</item>
</style>

<style name="MyRadioButtonStyle">
    <item name="android:button">@drawable/selector_custom_radio_buttons</item>
</style>

这是AndroidManifest.xml中的活动

<activity android:name=".social.NewsFeedActivity"
        android:theme="@style/ThemeNewsFeed">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>

注意:问题是我的自定义drawable在API 21及更高版本上运行良好但在API少于21时,它显示默认的单选按钮可绘制。那么我应该为低级API做些什么呢?

3 个答案:

答案 0 :(得分:1)

只需从活动主题中删除您的AppCompatRadioButton样式,然后直接设置为AppCompatRadioButton xml代码,如下所示

 <android.support.v7.widget.AppCompatRadioButton
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     style="@style/MyRadioButtonStyle""/>

和Style.xml

 <style name="MyRadioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
        <item name="android:button">@drawable/selector_custom_radio_buttons</item>
    </style>

答案 1 :(得分:0)

接受的解决方案对我不起作用。我正在使用AndroidX和目标API17。无需创建新样式。只需替换

"android:button"

使用

"app:buttonTint"

答案 2 :(得分:0)

确实,这是一个旧线程,但也许其他在同一问题上磕磕绊绊的人可能会在以下内容中有所帮助。我给它一个机会...

我使用 API 18 运行的应用程序也遇到了同样的问题。我无法使用 android:button="@null"android:background="@drawable/<selector>"。这仅适用于 API21 以后。

我的解决方案是简单地创建一个扩展 RadioButton 类的新类,但继承自 androidx.appcompat.widget.AppCompatRadioButton 而是简单地继承自 RadioButton 本身。 >

所以,我的“扩展”类看起来非常非常简单:

不是这个:

public class RadioButtonZed extends  androidx.appcompat.widget.AppCompatRadioButton {
    public RadioButtonZed(Context context, AttributeSet attrs) {
       super(context, attrs);
    }
}

但是这个:

@SuppressLint("AppCompatCustomView")
public class RadioButtonZed extends RadioButton {
    public RadioButtonZed(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

注意 @SuppressLint("AppCompatCustomView") 以避免 AS IDE 的抱怨。

我唯一要做的就是在我的“自己的”单选按钮类中添加一个且只有一个构造函数......

在我的 XML 文件中,我改变了这个:

<RadioButton
    android:id="@+id/rb_way_too_much"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_centerVertical="true"
    android:layout_marginStart="13dp"
    android:layout_toEndOf="@+id/tv_level_1"
    android:background="@drawable/radio"
    android:button="@null"
    tools:checked="true" />

为此:

<be.geertvancompernolle.mycustomradiobutton.RadioButtonZed
    android:id="@+id/rb_way_too_much"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_centerVertical="true"
    android:layout_marginStart="13dp"
    android:layout_toEndOf="@+id/tv_level_1"
    android:background="@drawable/radio"
    android:button="@null"
    tools:checked="true" />

这一次,@null@drawable/radio 按预期工作。

最后,而不是这个(注意我的按钮图像“内部”的原始按钮图像圆圈):

enter image description here

还有这个:

enter image description here

我现在有这个:

enter image description here

还有这个:

enter image description here

正是我想要的!