当前位置:   article > 正文

Android RadioGroup和RadioButton案例及详解

android radiogroup.check 会触发radiobutton的click事件吗

实现RadioButton由两部分组成,也就是RadioButtonRadioGroup配合使用.RadioGroup是单选组合框,可以容纳多个RadioButton的容器.在没有RadioGroup的情况下,RadioButton可以全部都选中;当多个RadioButtonRadioGroup包含的情况下,RadioButton只可以选择一个。并用setOnCheckedChangeListener来对单选按钮进行监听

  1. RadioGroup相关属性:
  2. RadioGroup.getCheckedRadioButtonId ();--获取选中按钮的id
  3. RadioGroup.clearCheck ();//---清除选中状态
  4. RadioGroup.check (int id);//---通过参入选项id来设置该选项为选中状态如果传递-1作为指定的选择标识符来清除单选按钮组的勾选状态,相当于调用clearCheck()操作
  5. setOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener); //--一个当该单选按钮组中的单选按钮勾选状态发生改变时所要调用的回调函数
  6. addView (View child, int index, ViewGroup.LayoutParams params);//---使用指定的布局参数添加一个子视图
  7. //参数 child 所要添加的子视图 index 将要添加子视图的位置 params 所要添加的子视图的布局参数
  8. RadioButton.getText();//获取单选框的值
  9. //此外,RadioButton的checked属性设置为true,代码里调用RadioButton的check(id)方法,不会触发onCheckedChanged事件

RadioButton和RadioGroup的关系:

1、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器

2、每个RadioGroup中的RadioButton同时只能有一个被选中

3、不同的RadioGroup中的RadioButton互不相干,即如果组A中有一个选中了,组B中依然可以有一个被选中

4、大部分场合下,一个RadioGroup中至少有2个RadioButton

5、大部分场合下,一个RadioGroup中的RadioButton默认会有一个被选中,并建议您将它放在RadioGroup中的起始位置

看案例:

1.定义布局文件:

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <LinearLayout
  6. android:orientation="vertical"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:layout_marginRight="5dp" >
  10. <TextView
  11. android:id="@+id/radiogroup_info_id"
  12. android:layout_width="228px"
  13. android:layout_height="wrap_content"
  14. android:text="我选择的是...?"
  15. android:textSize="30sp"
  16. />
  17. <RadioGroup
  18. android:id="@+id/radioGroup_sex_id"
  19. android:layout_width="match_parent"
  20. android:layout_height="match_parent"
  21. >
  22. <RadioButton
  23. android:id="@+id/boy_id"
  24. android:layout_width="match_parent"
  25. android:layout_height="match_parent"
  26. android:text="Boy"
  27. />
  28. <RadioButton
  29. android:id="@+id/girl_id"
  30. android:layout_width="match_parent"
  31. android:layout_height="match_parent"
  32. android:text="Girl"
  33. />
  34. </RadioGroup>
  35. <Button
  36. android:id="@+id/radio_clear"
  37. android:layout_width="match_parent"
  38. android:layout_height="match_parent"
  39. android:text="清除选中按钮"
  40. />
  41. <Button
  42. android:id="@+id/radio_add_child"
  43. android:layout_width="match_parent"
  44. android:layout_height="match_parent"
  45. android:text="添加单选项"
  46. />
  47. </LinearLayout>
  48. </ScrollView>

 2.java代码文件

 

  1. package com.dream.app.start.first.radiobutton;
  2. import com.dream.app.start.R;
  3. import com.dream.app.start.R.id;
  4. import com.dream.app.start.R.layout;
  5. import com.dream.app.start.three.utils.PublicClass;
  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.view.ViewGroup.LayoutParams;
  11. import android.widget.Button;
  12. import android.widget.RadioButton;
  13. import android.widget.RadioGroup;
  14. import android.widget.RadioGroup.OnCheckedChangeListener;
  15. import android.widget.TextView;
  16. import android.widget.ToggleButton;
  17. public class RadioButtonDemo extends PublicClass {
  18. private TextView textView=null;
  19. private RadioGroup radioGroup=null;
  20. private RadioButton radioButton_boy,radioButton_girl;
  21. private Button radio_clear,child;
  22. /* (non-Javadoc)
  23. * @see android.app.Activity#onCreate(android.os.Bundle)
  24. */
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. // TODO Auto-generated method stub
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.layout_frist_radiobuton);
  30. textView = (TextView)findViewById(R.id.radiogroup_info_id);
  31. //radioGroup
  32. radioGroup=(RadioGroup)findViewById(R.id.radioGroup_sex_id);
  33. radioButton_boy=(RadioButton)findViewById(R.id.boy_id);
  34. radioButton_girl=(RadioButton)findViewById(R.id.girl_id);
  35. child=(Button)findViewById(R.id.radio_add_child);
  36. //---
  37. radioGroup.setOnCheckedChangeListener(listen);
  38. radio_clear=(Button)findViewById(R.id.radio_clear);
  39. radio_clear.setOnClickListener(onClick);
  40. child.setOnClickListener(onClick);
  41. }
  42. private OnCheckedChangeListener listen=new OnCheckedChangeListener() {
  43. @Override
  44. public void onCheckedChanged(RadioGroup group, int checkedId) {
  45. int id= group.getCheckedRadioButtonId();
  46. switch (group.getCheckedRadioButtonId()) {
  47. case R.id.girl_id:
  48. textView.setText("我选择的是:"+radioButton_girl.getText());
  49. break;
  50. case R.id.boy_id:
  51. textView.setText("我选择的是:"+radioButton_boy.getText());
  52. break;
  53. default:
  54. textView.setText("我选择的是:新增");
  55. break;
  56. }
  57. }
  58. };
  59. private OnClickListener onClick=new OnClickListener() {
  60. @Override
  61. public void onClick(View v) {
  62. radio_clear=(Button)v;
  63. switch (radio_clear.getId()) {
  64. case R.id.radio_clear:
  65. radioGroup.check(-1);//清除选项
  66. // radioGroup.clearCheck(); //清除选项
  67. textView.setText("我选择的是...?");
  68. break;
  69. case R.id.radio_add_child:
  70. //新增子
  71. RadioButton newRadio =new RadioButton(getApplicationContext());
  72. newRadio.setText("新增");
  73. radioGroup.addView(newRadio, radioGroup.getChildCount());
  74. break;
  75. //
  76. default:
  77. break;
  78. }
  79. }
  80. };
  81. }

运行效果:

运行效果

选中一个按钮时的截图

 

3.

点击添加单选项的截图

 

 4:可以通过设置如下属性可以使单选按钮在显示文本的右边

                android:button="@null"                    

                android:drawableRight="@android:drawable/btn_radio"

效果:

 

RadioButton和CheckBox的区别:

1、单个RadioButton在选中后,通过点击无法变为未选中

    单个CheckBox在选中后,通过点击可以变为未选中

2、一组RadioButton,只能同时选中一个

     一组CheckBox,能同时选中多个

3、RadioButton在大部分UI框架中默认都以圆形表示

     CheckBox在大部分UI框架中默认都以矩形表示

==================================================

☆定制RadioButton样式

RadioButton长成什么样子是由其Background、Button等属性决定的,Android系统 
使用style定义了默认的属性,在android源码 

android/frameworks/base/core/res/res/values/styles.xml中可以看到默认的定义:

  1. <style name="Widget.CompoundButton.RadioButton">
  2. <item name="android:background">@android:drawable/btn_radio_label_background</item>
  3. <item name="android:button">@android:drawable/btn_radio</item>
  4. </style>

即其背景图是btn_radio_label_background,其button的样子是btn_radio 

btn_radio_label_background是什么? 
其路径是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_label_background.9.png 
可以看到是一个NinePatch图片,用来做背景,可以拉伸填充。 

btn_radio是什么? 

其路径是android/frameworks/base/core/res/res/drawable/btn_radio.xml 

是个xml定义的drawable,打开看其内容:

  1. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item android:state_checked="true" android:state_window_focused="false"
  3. android:drawable="@drawable/btn_radio_on" />
  4. <item android:state_checked="false" android:state_window_focused="false"
  5. android:drawable="@drawable/btn_radio_off" />
  6. <item android:state_checked="true" android:state_pressed="true"
  7. android:drawable="@drawable/btn_radio_on_pressed" />
  8. <item android:state_checked="false" android:state_pressed="true"
  9. android:drawable="@drawable/btn_radio_off_pressed" />
  10. <item android:state_checked="true" android:state_focused="true"
  11. android:drawable="@drawable/btn_radio_on_selected" />
  12. <item android:state_checked="false" android:state_focused="true"
  13. android:drawable="@drawable/btn_radio_off_selected" />
  14. <item android:state_checked="false" android:drawable="@drawable/btn_radio_off" />
  15. <item android:state_checked="true" android:drawable="@drawable/btn_radio_on" />
  16. </selector>

<item android:state_checked="true" android:state_pressed="true" 
          android:drawable="@drawable/btn_radio_on_pressed" /> 

意思即为当radiobutton被选中时,并且被按下时,其Button应该长成btn_radio_on_pressed这个样子。


文件是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_on_pressed.png 

drawable的item中可以有以下属性: 

  1. android:drawable="@[package:]drawable/drawable_resource"
  2. android:state_pressed=["true" | "false"]
  3. android:state_focused=["true" | "false"]
  4. android:state_selected=["true" | "false"]
  5. android:state_active=["true" | "false"]
  6. android:state_checkable=["true" | "false"]
  7. android:state_checked=["true" | "false"]
  8. android:state_enabled=["true" | "false"]
  9. android:state_window_focused=["true" | "false"]

当按钮的状态和某个item匹配后,就会使用此item定义的drawable作为按钮图片。 

从上面分析我们如果要修改RadioButton的外观,

自定义有三种方式:

1.方式一:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!-- 未选中->
  4. <item
  5. android:state_checked="false"
  6. android:drawable="@drawable/tabswitcher_long" />
  7. <!--选中->
  8. <item
  9. android:state_checked="true"
  10. android:drawable="@drawable/tabswitcher_short" />
  11. </selector>

在布局文件中使用

  1. <RadioGroup
  2. ...
  3. >
  4. <RadioButton
  5. ...
  6. android:button="@null"
  7. android:background="@drawable/radio"
  8. />
  9. </RadioGroup>

android:button="@null"  去除RadioButton前面的圆点

2.方式二:在JAVA代码中定义

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. if(event.getActionMasked() == MotionEvent.ACTION_DOWN){
  4. this.setBackgroundResource(com.wxg.tab.R.drawable.main_bg);
  5. }else if(event.getActionMasked()== MotionEvent.ACTION_DOWN) {
  6. this.setBackgroundResource(com.wxg.tab.R.drawable.hui);
  7. }
  8. return super.onTouchEvent(event);
  9. }

去除RadioButton前面的圆点adioButton.setButtonDrawable(android.R.color.transparent);

3. 方式三

使用XML文件定义,在JAVA代码中使用 radioButton.setBackgroundResource(R.drawable.radio);调用

==============================================================

                                                设置RadioButton在文字的右边

  1. <RadioButton
  2. android:id="@+id/button2"
  3. android:layout_width="fill_parent"
  4. android:layout_height="50dip"
  5. android:button="@null"
  6. android:drawableRight="@android:drawable/btn_radio" //在右边
  7. android:paddingLeft="30dip"
  8. android:text="Android高手"
  9. android:textSize="20dip" />

================================================================

自定义 radiobutton 文字颜色随选中状态而改变

主要是写一个 color selector

在res/建一个文件夹取名color

res/color/color_radiobutton.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:state_checked="true"
  4. android:color="@color/color_text_selected"/>
  5. <!-- not selected -->
  6. <item android:color="@color/color_text_normal"/>
  7. </selector>

布局文件定义控件:
  1. <RadioButton
  2. android:id="@+id/radiobutton_1"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:background="@drawable/selector_radio"
  6. android:button="@null"
  7. android:checked="true"
  8. android:gravity="center"
  9. android:text="目录"
  10. <!--自定义文本颜色 -->
  11. android:textColor="@color/color_radiobutton"
  12. android:textSize="@dimen/font_size"
  13. android:textStyle="bold" />

============================================================
RadioButton上显示图片和文字

使用XML文件很简单就可以实现,但是有时必须要使用java code 的方式动态实现,这就有些复杂了,这需要继承RadioButton并覆盖其中的onDraw方法。

在代码中的image是Bitmap对象。

  1. @Override
  2. protected void onDraw(Canvas canvas) {
  3. super.onDraw(canvas);
  4. if(image!=null){
  5. Paint pt = new Paint();
  6. pt.setARGB(255,66,66,66);
  7. //消除锯齿
  8. pt.setAntiAlias(true);
  9. //居中显示图片
  10. int imageX=(int)(this.getWidth()-image.getWidth())/2;
  11. canvas.drawBitmap(image,imageX,5,pt);
  12. pt.setARGB(255,255,255,255);
  13. //居中显示字符串
  14. int strX=(int)(this.getWidth()-name.getBytes().length*5.5)/2;
  15. canvas.drawText(name,strX,(image.getHeight()+15),pt);
  16. }
  17. }

 






转载于:https://my.oschina.net/amigos/blog/59261

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/733730
推荐阅读
相关标签
  

闽ICP备14008679号