在构造函数中使用自己的样式扩展RadioButton

时间:2013-12-02 14:27:06

标签: android radio-button android-drawable android-styles

我想知道为什么我的代码不能按照我认为应该工作的方式工作。我通过一点改动扩展了原始RadioButton小部件。这是代码:

<!-- language: java -->

public class RadioButton extends android.widget.RadioButton {
    public RadioButton(Context context) {
        super(context);
    }

    public RadioButton(Context context, AttributeSet attrs) {
        super(context, attrs, R.style.MyRadioButton);
    }

    public RadioButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
}

此更改在构造函数中为R.style.MyRadioButton。接下来,我在styles.xml输入以下行:

<!-- language: xml -->

<style name="MyRadioButton" parent="@android:style/Widget.CompoundButton.RadioButton" />

Widget.CompoundButton.RadioButtonstyle,为drawable定义RadioButton。 要使用我自己的RadioButton我做了一个布局:     

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <RadioButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Default radio button" />

        <com.example.test.RadioButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="My radio button" />
    </RadioGroup>
</LinearLayout>

我认为我做的是从默认RadioButton继承样式并在构造函数中使用该样式(与原始RadioButton源代码中的样式相同)。问题是我的RadioButton没有显示任何drawable,只是文字,我想知道为什么?

它也不会对点击做出反应,因为点击它并不会取消选中“默认单选按钮”,尽管两者都在RadioGroup

1 个答案:

答案 0 :(得分:2)

好的,我终于在我的代码中发现了一个问题。

Android文档说:

  

defStyleAttr当前主题中的一个属性,包含对要应用于此视图的样式资源的引用。如果为0,则不应用默认样式。

我做错了是传递style而不是attr(引用当前主题中的样式)。 所以这是解决方案:     

public RadioButton(Context context, AttributeSet attrs) {
    super(context, attrs, R.attr.myRadioButtonStyle);
}

我将styles.xml中的代码保持不变:     

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

但我必须在themes.xml中创建自定义主题并将其应用于当前Activity:     

<style name="MyTheme">
    <item name="myRadioButtonStyle">@style/MyRadioButtonStyle</item>
</style>

attrs.xml中:     

<declare-styleable name="MyTheme">
    <attr name="myRadioButtonStyle" format="reference" />
</declare-styleable>

我之前的代码无效,是基于其他人的旧代码,其中View构造函数属性被命名为defStyle,这导致我犯了错误。 Android开发人员通过将属性重命名为defStyleAttr来修复文档。这是一个记录它的问题:https://code.google.com/p/android/issues/detail?id=12683

上一篇文章清楚地说:

  

文档不正确。第三个构造函数必须是一个属性,例如R.attr.*