Android开发实战:单选按钮RadioButton应用与源码解析

在Android应用开发中,单选按钮(RadioButton)是一个常用的UI组件,广泛应用于设置选项、问卷调查等场景。本文将深入探讨RadioButton的应用技巧,并通过源码解析揭示其工作原理,帮助开发者更好地掌握这一组件。

一、RadioButton的基本应用

1.1 添加RadioButton到布局

首先,在布局文件中添加RadioButton组件:

<RadioGroup
    android:id="@+id/radioGroup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RadioButton
        android:id="@+id/radioButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选项一" />

    <RadioButton
        android:id="@+id/radioButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选项二" />

    <RadioButton
        android:id="@+id/radioButton3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选项三" />
</RadioGroup>

1.2 监听选中事件

在Activity中,通过RadioGroup监听RadioButton的选中事件:

public class MainActivity extends AppCompatActivity {

    private RadioGroup radioGroup;
    private RadioButton radioButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        radioGroup = findViewById(R.id.radioGroup);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                radioButton = findViewById(checkedId);
                Toast.makeText(MainActivity.this, "选中了:" + radioButton.getText(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

二、RadioButton的高级应用

2.1 动态添加RadioButton

有时需要在运行时动态添加RadioButton,可以通过以下代码实现:

RadioGroup radioGroup = findViewById(R.id.radioGroup);
for (int i = 0; i < 5; i++) {
    RadioButton radioButton = new RadioButton(this);
    radioButton.setText("动态选项" + (i + 1));
    radioGroup.addView(radioButton);
}

2.2 自定义RadioButton样式

通过自定义Drawable或Selector,可以改变RadioButton的样式:

<!-- res/drawable/radio_button_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/radio_button_selected" android:state_checked="true" />
    <item android:drawable="@drawable/radio_button_unselected" />
</selector>

然后在RadioButton中应用该样式:

<RadioButton
    android:id="@+id/radioButton1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/radio_button_selector"
    android:text="选项一" />

三、RadioButton源码解析

3.1 RadioButton继承关系

RadioButton继承自CompoundButton,CompoundButton又继承自Button,最终继承自TextView。这种继承关系使得RadioButton具备文本显示和按钮点击的特性。

3.2 核心属性解析

  • android:button:用于设置RadioButton的图标。
  • android:checked:用于设置RadioButton的初始选中状态。
  • android:text:用于设置RadioButton显示的文本。

3.3 事件处理机制

RadioButton通过setOnCheckedChangeListener监听选中状态的变化。内部实现中,CompoundButton类提供了setCheckedonCheckedChanged等方法,用于处理选中状态的改变。

public class CompoundButton extends Button implements Checkable {
    private boolean mChecked;
    private OnCheckedChangeListener mOnCheckedChangeListener;

    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
            if (mOnCheckedChangeListener != null) {
                mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
            }
        }
    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        mOnCheckedChangeListener = listener;
    }

    public interface OnCheckedChangeListener {
        void onCheckedChanged(CompoundButton buttonView, boolean isChecked);
    }
}

四、实战案例:问卷调查应用

4.1 需求分析

设计一个简单的问卷调查应用,包含多个问题,每个问题有多个选项,用户只能选择一个选项。

4.2 布局设计

使用LinearLayout嵌套RadioGroup和RadioButton,实现问卷布局。

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="问题一:" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <RadioButton
            android:id="@+id/radioButton1_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="选项一" />

        <RadioButton
            android:id="@+id/radioButton1_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="选项二" />
    </RadioGroup>

    <!-- 更多问题及选项 -->
</LinearLayout>

4.3 逻辑实现

在Activity中,监听每个RadioGroup的选中事件,保存用户的选择结果。

public class QuestionnaireActivity extends AppCompatActivity {

    private SparseArray<String> answers = new SparseArray<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_questionnaire);

        RadioGroup radioGroup1 = findViewById(R.id.radioGroup1);
        radioGroup1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RadioButton radioButton = findViewById(checkedId);
                answers.put(1, radioButton.getText().toString());
            }
        });

        // 监听其他RadioGroup
    }

    public void submitAnswers(View view) {
        // 处理提交逻辑
        for (int i = 0; i < answers.size(); i++) {
            int key = answers.keyAt(i);
            String value = answers.get(key);
            Log.d("Questionnaire", "问题" + key + ": " + value);
        }
    }
}

五、总结

RadioButton作为Android开发中的常用组件,其应用广泛且实现简单。通过本文的介绍,开发者可以掌握RadioButton的基本和高级应用,并通过源码解析深入理解其工作原理。在实际开发中,灵活运用RadioButton可以提升用户体验,构建更加丰富的应用功能。