Android之RadioButton和RadioGroup结合Dialog的多种运用详解
2016-08-07 21:48
453 查看
RadioButton(单选按钮)在Android开发中应用的非常广泛,比如一些选择项的时候,会用到单选按钮。它是一种单选框双状态的按钮,可以选择或不选择。在RadioButton没有被选中时,用户能够按下或点击来选中它。下一篇文章将详细介绍自定义Dialog以及详解如何编写自定义控件。
文章结构:
1.全面介绍RadioButton的基本应用(有属性总结大全)
2.RadioButton+Dialog的结合
3.RadioButton+Dialog+listview的结合
一、全面介绍RadioButton的基本自定义应用
先上图
我们知道原生的radiobutton是以圆圈作为标记的,格式也相对生硬。这里的radiobutton风格采用的是谷歌设置风格,简洁。
下面是代码的详解:
1.此处页面的fragment_link.xml,并讲解一些该注意的点
(1)必须要为每个radiobutton设置上id,同时id不能有冲突,不然会引起资源的引用错误导致运行异常 (2)须配合一个资源文件进行选中情况和非选中情况的设定<?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"> <!-- 可以看到需要一个radiogroup进行radiobutton的嵌套,我们可以选择的排列方式进行设定。 --> <RadioGroup android:id="@+id/groupLink" android:gravity="center" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="150dp" > <!-- 解释一些属性:android:button=“@null”是去掉原生radiobutton的圆圈单选 --> <!-- android:checked是初始化选定状态 android:drawableRight就是自定义的关键,设置选中和非选中状态的样式。这里的属性是设置一个图片在radiobutton的右边,我们当然也可以设置在左边 --> <!-- android:drawablePadding="" 设置图片和文字距离 --> <!-- 小tips,radiogroup里面的格式我们还是可以加些控件的,比如这里加了textview --> <RadioButton android:id="@+id/rbtn_Bluetooth" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="BlueTooth" android:textSize="17.0sp" android:textColor="@android:color/black" android:layout_weight="1" android:checked="true" android:button="@null" android:paddingLeft="30dp" android:drawableRight="@drawable/fragment_link_radiobutton_style" /> <TextView android:layout_width="match_parent" android:layout_height="1px" android:background="@color/gray"/> <RadioButton android:id="@+id/rbtn_USB" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="USB" android:textSize="17.0sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:paddingLeft="30dp" android:drawableRight="@drawable/fragment_link_radiobutton_style" /> <TextView android:layout_width="match_parent" android:layout_height="1px" android:background="@color/gray"/> <RadioButton android:id="@+id/rbtn_TCP" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TCP" android:textSize="17.0sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:paddingLeft="30dp" android:drawableRight="@drawable/fragment_link_radiobutton_style" /> <TextView android:layout_width="match_parent" android:layout_height="1px" android:background="@color/gray"/> </RadioGroup> </LinearLayout>
2.里面选中与非选中样式的定义:在drawable文件夹下新建个资源文件fragment_link_radiobutton_style.xml
<!-- 就是一个selector标签,state_checked是选中与非选中状态,drawable就是自己定义的图片啦--> <?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/transparent" /> <item android:state_checked="true" android:drawable="@drawable/tick" /> </selector>
3.在java文件的调用,就是些初始化以及监听写法。本文只写一次。
public class LinkFragment extends BaseFragment { private RadioGroup groupLink; private RadioButton rbtn_Bluetooth; private RadioButton rbtn_USB; private RadioButton rbtn_TCP; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_link, null); groupLink = (RadioGroup) view.findViewById(R.id.groupLink); rbtn_Bluetooth = (RadioButton) view.findViewById(R.id.rbtn_Bluetooth); rbtn_USB = (RadioButton) view.findViewById(R.id.rbtn_USB); rbtn_TCP = (RadioButton) view.findViewById(R.id.rbtn_TCP); initListener(); return view; } private void initListener() { groupLink.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == rbtn_Bluetooth.getId()) { } else if (checkedId == rbtn_USB.getId()) { } else if (checkedId == rbtn_TCP.getId()) { } } }); } }
二、RadioButton+Dialog的结合
先上图
可以看到也是一个仿谷歌风格的样式
1.先给dialog的布局代码dialo_broadcast.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"> <RadioGroup android:id="@+id/groupBroadcast" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:orientation="vertical"> <RadioButton android:id="@+id/rbtn_BroadcastClose" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="关闭" android:textSize="17sp" android:textColor="@android:color/black" android:layout_weight="1" android:checked="true" android:button="@null" android:drawablePadding="20dp" android:paddingLeft="26dp" android:drawableLeft="@drawable/settingbroadst_checked_style"/> <RadioButton android:id="@+id/rbtn_BroadcastFifteen" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="15秒" android:textSize="17sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:drawablePadding="20dp" android:paddingLeft="26dp" android:drawableLeft="@drawable/settingbroadst_checked_style"/> <RadioButton android:id="@+id/rbtn_BroadcastThirty" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="30秒" android:textSize="17sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:drawablePadding="20dp" android:paddingLeft="26dp" android:drawableLeft="@drawable/settingbroadst_checked_style"/> <RadioButton android:id="@+id/rbtn_BroadcastFourty" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="45秒" android:textSize="17sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:drawablePadding="20dp" android:paddingLeft="26dp" android:drawableLeft="@drawable/settingbroadst_checked_style"/> <RadioButton android:id="@+id/rbtn_BroadcastMinute" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="30dp" android:text="60秒" android:textSize="17sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:drawablePadding="20dp" android:paddingLeft="26dp" android:drawableLeft="@drawable/settingbroadst_checked_style"/> </RadioGroup> </LinearLayout>
样式也是像本文第一点,只不过换了两个图片
接下来直接列出java文件中的调用:
private void setDialogBroadcast() { View viewDialogBroadcast; //使用view来接入方法写出的dialog,方便相关初始化 LayoutInflater inflater; //引用自定义dialog布局 inflater=LayoutInflater.from(getActivity()); viewDialogBroadcast = (LinearLayout) inflater.inflate(R.layout.dialog_broadcast, null); //那个layout就是我们可以dialog自定义的布局啦 final RadioGroup groupBroadcast = (RadioGroup) viewDialogBroadcast.findViewById(R.id.groupBroadcast); final RadioButton rbtn_BroadcastClose = (RadioButton) viewDialogBroadcast.findViewById(R.id.rbtn_BroadcastClose); final RadioButton rbtn_BroadcastFifteen = (RadioButton) viewDialogBroadcast.findViewById(R.id.rbtn_BroadcastFifteen); final RadioButton rbtn_BroadcastThirty = (RadioButton) viewDialogBroadcast.findViewById(R.id.rbtn_BroadcastThirty); final RadioButton rbtn_BroadcastFourty = (RadioButton) viewDialogBroadcast.findViewById(R.id.rbtn_BroadcastFourty); final RadioButton rbtn_BroadcastMinute = (RadioButton) viewDialogBroadcast.findViewById(R.id.rbtn_BroadcastMinute); groupBroadcast.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId==rbtn_BroadcastClose.getId()){ } else if (checkedId==rbtn_BroadcastFifteen.getId()){ } else if (checkedId==rbtn_BroadcastThirty.getId()){ } else if (checkedId==rbtn_BroadcastFourty.getId()){ } else if (checkedId==rbtn_BroadcastMinute.getId()){ } } }); new AlertDialog.Builder(getActivity()) .setView(viewDialogBroadcast) .setTitle("周期") .setIcon(R.drawable.setting) .create().show(); }
三、RadioButton+Dialog+listview的结合
由于这个比较多,并且因为是在Dialog中使用,所以采用的是动态添加布局listview,这里先写出结构:1.需要listview的item和dialog的布局文件,2.需要listview的适配器(其中借用了别人的一个javabean) 3.到最后的调用
先上图
1.dialog的布局:
<?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:layout_marginTop="10dp" android:layout_marginBottom="20dp"> </LinearLayout>
item的布局:
<?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="horizontal"> <RadioButton android:id="@+id/rbtn_item_dialog_accent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:text="关闭" android:textSize="17sp" android:textColor="@android:color/black" android:layout_weight="1" android:button="@null" android:drawablePadding="20dp" android:paddingLeft="26dp" android:drawableLeft="@drawable/settingbroadst_checked_style"/> </LinearLayout>
那个选中与非选中状态的代码就不给了,随意弄吧,上面也有介绍。
2.适配器(关键!)
public class AccentSettingAdapter extends BaseAdapter { Context context; LayoutInflater mInflater; ViewHolder holder; List<org.fishDroneGCS.utils.Book> Book; Book book; // 标记用户当前选择的那一个发音(就是用来标记item的) private int index = -1; public AccentSettingAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); } public void setList(List<Book> Book) { this.Book = Book; } // 选中当前选项时,让其他选项不被选中,一会会被调用的,这里逻辑也很清晰。 public void select(int position) { if (!Book.get(position).isSelected()) { Book.get(position).setSelected(true); for (int i = 0; i < Book.size(); i++) { if (i != position) { Book.get(i).setSelected(false); } } } notifyDataSetChanged(); } @Override public int getCount() { return Book.size(); } @Override public Object getItem(int position) { return Book.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { holder = new ViewHolder(); if (convertView == null) { convertView = mInflater.inflate(R.layout.item_dialog_accent, null); holder.radioBtn = (RadioButton) convertView .findViewById(R.id.rbtn_item_dialog_accent); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } //这里是让listview和数据对接上,很清晰看出 book = (Book) getItem(position); holder.radioBtn.setChecked(book.isSelected()); holder.radioBtn.setText(book.getBookName()); //这里就是监听radiobutton啦,索引的位置跟那个select的结合,才能完美跟radiobutton结合,让点击跟位置跟数据结合以及只选一个 holder.radioBtn .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { index = position; notifyDataSetChanged(); } } }); if (index == position) {// 选中的条目和当前的条目是否相等 holder.radioBtn.setChecked(true); } else { holder.radioBtn.setChecked(false); } return convertView; } //使用了内部类,标记我们的item中的radiobutton class ViewHolder { RadioButton radioBtn; } }
还有一个借用别人的一个javabean类啦,Book类
public class Book { private String bookName; private boolean isSelected = false; public Book(){}; public Book(String bookName,String author,int publishTime){ this.bookName = bookName; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public boolean isSelected() { return isSelected; } public void setSelected(boolean isSelected) { this.isSelected = isSelected; } }
4.嗯,到了最后的调用了。会发现很简单,就是用一个方法,就可以调用这个dialog+listview+radiobutton的结合啦
private void setDialogAccent() { //放入数据源 list = new ArrayList<Book>(); book = new Book(); for (int i = 0; i < 8; i++) { book.setBookName("啊啊啊啊"); list.add(book); } //引用自定义dialog布局 LayoutInflater inflater = LayoutInflater.from(getActivity()); View view = inflater.inflate(R.layout.dialog_accent, null); //指定dialog引用此布局 LinearLayout dialogAccent = (LinearLayout) inflater.inflate(R.layout.dialog_accent, null); //listview初始化 ListView listView = new ListView(getActivity()); listAdapter = new AccentSettingAdapter(getActivity()); listAdapter.setList(list); listView.setAdapter(listAdapter); dialogAccent.addView(listView); //动态添加listview listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { listAdapter.select(position); //刚刚所用的方法啦,就是保证只选一个 } }); new AlertDialog.Builder(getActivity()) //dialog的设置就不详细讲了,上面有 .setView(dialogAccent) .setTitle("选择发音人及语种") .setIcon(R.drawable.setting) .create().show(); }
radiobutton的多种运用已经讲完了。下一篇博客将会详细讲radiobutton的自定义是怎样做的,以及如何去进行编写自己的自定义控件,自定义view。欢迎来讨论,共同学习。
转载请标明:【JackFrost的博客】
相关文章推荐
- Android RadioGroup和RadioButton案例及详解
- android中RadioGroup、RadioButton、Spinner、EditText用法详解(含示例截图和源代码)
- Android RadioGroup和RadioButton案例及详解
- Android 单选队列 RadioGroup与RadioButton详解
- Android RadioGroup和RadioButton案例及详解
- android自定义RadioGroup实现可以添加多种布局
- tabHost研究二 ,android应用中,大部分的软件都会采用把按钮放在底部显示(tabHost)。利用三个Radiobutton嵌套在RadioGroup 。
- Android常见控件之RadioGroup,RadioButton,CheckBox和Toast
- Android RadioGroup中设置默认选中RadioButton 后,选中两个的问题 解决方法
- Android开发之四(五):常用控件之单项选择(RadioGroup和RadioButton)
- Android.自定义控件的实现_RadioButton 和RadioGroup
- Android UI控件之RadioGroup、RadioButton
- Android RadioGroup中横向、竖向布局RadioButton的问题
- android自定义RadioGroup实现可以添加多种布局
- Android RadioGroup中设置默认选中RadioButton 后,选中两个的问题 解决方法
- Android:UI控件RatingBar、SeekBar、ProgressBar、RadioGroup、RadioButton、CheckBox、TextView
- Android开发--控件之RadioGroup、RadioButton、CheckBox、Toast
- UI组件详解2---- RadioGroup、RadioButton、CheckBox、ListView、Spinner
- Android开发视频教程之十二(RadioGroup、RadioButton、CheckBox和Toast的使用)
- android应用开发笔记---常用控件RadioGroup和RadioButton及Toast