CheckBox的单选框实现

来源:互联网 发布:java 就业培训机构 编辑:程序博客网 时间:2024/05/20 12:22

这里有三种方法可以实现:
第一种是:直接使用CheckBox,再使用代码来修改checkBox的选中状态;
  优点:实现简单,容易懂
  缺点:需要给每个checkBox设置id
第二种是:在RadioGroup中使用自定义的RadioButton(其实就是使用图片,改变效果);
  优点:代码简单,多使用的是布局文件
  缺点:布局文件不好调
第三种是:使用CheckBox+ListView实现;
  优点:布局简单
  缺点:代码多而复杂


一、第一种方法,只使用CheckBox实现单选


(1)配置文件activity_main.xml

<?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" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="30dp"        android:background="#F5F5F5" >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            android:text="以下情况,请代表根据实际情况打勾注明:"            android:textColor="#5E5E5E"            android:textSize="15sp" />    </LinearLayout>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="12dp"        android:layout_marginTop="12dp"        android:text="1.通过调查研究形成:"        android:textColor="#9CE1FF"        android:textSize="15sp" />    <CheckBox        android:id="@+id/cb1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="12dp"        android:checked="true"        android:text="专题调研"        android:textColor="#5E5E5E"        android:textSize="15sp" />    <CheckBox        android:id="@+id/cb2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="12dp"        android:text="视察"        android:textColor="#5E5E5E"        android:textSize="15sp" />    <CheckBox        android:id="@+id/cb3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="12dp"        android:text="座谈"        android:textColor="#5E5E5E"        android:textSize="15sp" />    <CheckBox        android:id="@+id/cb4"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="12dp"        android:text="走访等其他调研方式"        android:textColor="#5E5E5E"        android:textSize="15sp" /></LinearLayout>
(2)主方法MainActivity.java

package com.example;import com.example.aaa.R;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.CheckBox;public class MainActivity extends Activity implements OnClickListener{private CheckBox cb1,cb2,cb3,cb4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.aaaa);this.cb1 = (CheckBox) findViewById(R.id.cb1);this.cb2 = (CheckBox) findViewById(R.id.cb2);this.cb3 = (CheckBox) findViewById(R.id.cb3);this.cb4 = (CheckBox) findViewById(R.id.cb4);cb1.setOnClickListener(this);cb2.setOnClickListener(this);cb3.setOnClickListener(this);cb4.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.cb1:cb1.setChecked(true);cb2.setChecked(false);cb3.setChecked(false);cb4.setChecked(false);break;case R.id.cb2:cb1.setChecked(false);cb2.setChecked(true);cb3.setChecked(false);cb4.setChecked(false);break;case R.id.cb3:cb1.setChecked(false);cb2.setChecked(false);cb3.setChecked(true);cb4.setChecked(false);break;case R.id.cb4:cb1.setChecked(false);cb2.setChecked(false);cb3.setChecked(false);cb4.setChecked(true);break;default:break;}}}

二、第二种方法,使用自定义RadioButton实现单选CheckBox:


(1)在drawable文件中创建一个Raido.xml文件:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >    <item       android:state_checked="false"       android:drawable="@drawable/tabswitcher_short" />       <item       android:state_checked="true"       android:drawable="@drawable/tabswitcher_long" />  </selector>
(2)布局文件activity_main.xml

<?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" >    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="通过调查研究形成:" />    <RelativeLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content" >        <RadioGroup            android:id="@+id/radioGroup"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:gravity="center"            android:orientation="vertical" >            <RadioButton                android:id="@+id/btn_0"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:background="@drawable/radio"                android:layout_marginTop="1dp"                android:button="@null"                android:checked="true"                android:gravity="center" />            <RadioButton                android:id="@+id/btn_1"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="1dp"                android:background="@drawable/radio"                android:button="@null"                android:gravity="center" />            <RadioButton                android:id="@+id/btn_2"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="1dp"                android:background="@drawable/radio"                android:button="@null"                android:gravity="center" />            <RadioButton                android:id="@+id/btn_3"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="1dp"                android:background="@drawable/radio"                android:button="@null"                android:gravity="center" />        </RadioGroup>        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_toRightOf="@id/radioGroup"            android:layout_marginLeft="5dp"            android:orientation="vertical" >            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp"                android:text="专题调研" />            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp"                android:text="视察" />            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp"                android:text="座谈" />            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginTop="3dp"                android:text="走访等其他调研方式" />        </LinearLayout>    </RelativeLayout></LinearLayout>
(3)MainActivity.java,在这里我实现的简单,其实可以等到要使用的时候再去获取选择的值:

package com.example;import com.example.aaa.R;import android.app.Activity;import android.os.Bundle;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;public class MainActivity extends Activity{private RadioGroup radioGroup;private RadioButton radiobutton;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.aaaa);radiobutton = (RadioButton) findViewById(R.id.btn_0);radioGroup = (RadioGroup) this.findViewById(R.id.radioGroup);radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {//System.out.println("checkID:"+checkedId);System.out.println("radiobutton.isChecked():"+radiobutton.isChecked());}});}}

三、第三种方式,使用ListView+CheckBox实现CheckBox的单选框:


(1)创建一个adapter的布局文件list_adapter.xml:

<?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="wrap_content"    android:orientation="horizontal" >    <CheckBox        android:id="@+id/checkBox"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_marginLeft="5dp"        android:clickable="false"        android:focusable="false"        android:focusableInTouchMode="false" />    <TextView        android:id="@+id/tv_name"        android:layout_width="210dp"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:textSize="14sp" /></LinearLayout>
(2)布局文件activity_main.xml:

<?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" >      <TextView          android:id="@+id/tv_title"        android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:text="通过调查研究形成:" />                <ListView            android:id="@+id/listview"            android:layout_width="fill_parent"            android:layout_height="400dp"            android:cacheColorHint="#00000000"            android:clickable="true"            android:descendantFocusability="blocksDescendants"            android:fadingEdge="none"            android:fastScrollEnabled="true"            android:scrollingCache="false" /></LinearLayout>
(3)主代码MainActivity.java:

package com.example;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.example.bbb.R;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity{    private ListView listView;         private Map<Integer, Boolean> isSelected;          private List<String> beSelectedData = new ArrayList<String>();         ListAdapter adapter;        private List<String> cs = null;     @Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) this.findViewById(R.id.listview);          cs  = new ArrayList<String>();  //存放显示的字符串        cs.add("专题调研");          cs.add("视察");          cs.add("座谈");         cs.add("走访等其他调研方式");          initList(); }void initList(){           if (cs == null || cs.size() == 0)              return;                 // 清除已经选择的项 ,用于存放当前选择的内容(字符串)        if (beSelectedData.size() > 0) {              beSelectedData.clear();         }         //将选中状态都置为false        if (isSelected != null)              isSelected = null;          isSelected = new HashMap<Integer, Boolean>();          for (int i = 0; i < cs.size(); i++) {              isSelected.put(i, false);              if(i == 0){            isSelected.put(i, true);            beSelectedData.add(cs.get(i));            }        }                   adapter = new ListAdapter(this, cs); //设置适配器        listView.setAdapter(adapter);          listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);          adapter.notifyDataSetChanged();  //提醒适配器跟新界面                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  //listview的点击事件            public void onItemClick(AdapterView<?> parent, View view,                      int position, long id) {                 Log.i("map", cs.get(position).toString());              }          });         } class ListAdapter extends BaseAdapter {            private Context context;          private List<String> cs;          private LayoutInflater inflater;          public ListAdapter(Context context, List<String> data) {              this.context = context;              this.cs = data;              inflater = LayoutInflater.from(context);          }             public int getCount() {              return cs.size();          }            public Object getItem(int position) {              return cs.get(position);          }            public long getItemId(int position) {              return 0;          }            public View getView(int position1, View convertView, ViewGroup parent) {              ViewHolder holder = null;              View view = null;              final int position = position1;                        //界面重用            if (convertView == null) {                  convertView = inflater.inflate(R.layout.list_adapter,null);                  holder = new ViewHolder();                  holder.checkBox = (CheckBox) convertView                          .findViewById(R.id.checkBox);                   holder.tv_name = (TextView) convertView                          .findViewById(R.id.tv_name);                  convertView.setTag(holder);              } else {                  view = convertView;                  holder = (ViewHolder) view.getTag();              }                            //checkBox的点击事件            holder.checkBox.setOnClickListener(new OnClickListener() {                  public void onClick(View v) {                      // 当前点击的CheckBox是否是点击状态                    boolean current = !isSelected.get(position);                      // 先将所有的置为FALSE                      for(Integer p : isSelected.keySet()) {                          isSelected.put(p, false);                      }                      // 再设置当前选择CheckBox的实际状态                      isSelected.put(position, current);                      ListAdapter.this.notifyDataSetChanged();  //跟新界面                                        beSelectedData.clear();  //每次点击,都跟新点击的内容                    if(current) beSelectedData.add(cs.get(position));                  }              });              holder.tv_name.setText(cs.get(position).toString());              holder.checkBox.setChecked(isSelected.get(position));              return convertView;          }      }            class ViewHolder {          CheckBox checkBox;          TextView tv_name;      }  }  
ok,结束!







0 0