`
thunder_yan
  • 浏览: 113351 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android:创建网格状的RadioGroup

阅读更多

 

Android系统自带的RadioGroup只有两种排列方式:横向或纵向。 但是现实中可能需要将RadioGroup按网格状排列, 如何实现?

本文将介绍实现方法。

先看效果图:

 

radiogourp_grid

思路:

1. 创建一个PopupWindow的弹出窗口

2. 在PopupWindow中填充一个GridView

3. 在GridView内填充多个由img和text组合而成的、外形类似于RadioButton的组合View视图

4. 当选项有改变的饿时候,更新GridView内的视图。

实现过程:

1. 创建由Img和Text组合而成的、外形类似于RadioButton的组合View视图(下面简称URadioButton)

先看URadioButton的布局,左图标右文字:只需要把图片或文字填充到<ImageView>或<TextView>中就可以实现内容不同的URadioButton。

item_radiobutton.xml:

 

<?xml version="1.0" encoding="utf-8"?>   
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/item_radiobutton"  
    android:orientation="horizontal"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >    
  <ImageView android:id="@+id/item_radioimg"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    />
  <TextView  
    android:layout_toRightOf="@+id/item_radioimg"
      android:id="@+id/item_radiotext"  
    android:layout_width="wrap_content"    
    android:layout_height="wrap_content"    
    android:layout_centerVertical="true"  
    />    
</RelativeLayout> 
 

我们的目标是把多个这个的URadioButton填充到GridView中,然而从GridView的填充函数:

GridView.setAdapter(ListAdapter adapter)

中,可以看出需要将一个Adapter填充到GridView中。那么先编写一个方法:该方法能够生成由多URadioButton组成的Adapter。

/*
 * 创建包含多个radiobutton的Adapter。
 * RadioButton的图片有redioImg指定,RadioButton的文字由radioNameArray指定
 * RadioButton的图片和文字的相对位置在item_radiobutton.xml布局文件中指定。
 */
private SimpleAdapter getRadioButtonAdapter(int redioImage, String[] radioNameArray) {
    ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
    for (int i = 0; i < radioNameArray.length; i++) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("itemRadioImg", redioImage);
        map.put("itemRadioText", radioNameArray[i]);
        data.add(map);
    }
    SimpleAdapter simperAdapter = new SimpleAdapter(this, data,
            R.layout.item_radiobutton, new String[] { "itemRadioImg", "itemRadioText" },
            new int[] { R.id.item_radioimg, R.id.item_radiotext });
    return simperAdapter;
}
 下面的代码为:调用上面定义的getRadioButtonAdapter方法生成我们所需要Adapter:
private SimpleAdapter mWishesAdapter;
private String[] mWishes = {"睡到自然醒", "钱多手抽筋", "加薪又升职", "妞多任我选"};
...
...
mWishesAdapter = getRadioButtonAdapter(R.drawable.btn_radio_off, mWishes);

其中R.drawable.btn_radio_off图标为:

btn_radio_off 。 这个图标是从Android源码中拿出来的。

 

2. 在GridView中填充URadioButtons

这里就直接贴代码了:

mWishesAdapter = getRadioButtonAdapter(R.drawable.btn_radio_off, mWishes);
LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
mViewGroup = (ViewGroup) mLayoutInflater.inflate(R.layout.radiogroup_gridview, null, true);    
mGrid = (GridView)mViewGroup.findViewById(R.id.gridview);
mGrid.setAdapter(mWishesAdapter);
mGrid.requestFocus();
mGrid.setOnItemClickListener( new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
        if(mLastItme != arg2){
            //更新图标、实现单选
            if(mLastItme>=0){
                ChangeRadioImg(mWishesAdapter, mLastItme,false);                      
            }
            mLastItme = arg2;
            ChangeRadioImg(mWishesAdapter,arg2,true); 
        }
    }
});    
 

为了实现单选,所以每当选择了新选项的时候,就将以前的选中的选项的图标改为:off, 本次选中的选型的图标改为On,而实现这个功能的方法为:ChangeRadioImg():

/*
 * 根据选中的状态来更新图标。也就是实现我们自定义RadioGroup的单选功能
 */
private void ChangeRadioImg(SimpleAdapter adapter,int selectedItem, boolean on) {      
    HashMap<String, Object> map = (HashMap<String, Object>)adapter.getItem(selectedItem);     
    if(on)   
        map.put("itemRadioImg", R.drawable.btn_radio_on);   
    else  
        map.put("itemRadioImg", R.drawable.btn_radio_off);   
    adapter.notifyDataSetChanged();   

}  
 

这里的R.drawable.btn_radio_on的图标为: 
btn_radio_on。 这个图标也是从Android源码中拿来的。
 
3. 在PopupWindow中填上GridView 
经过上面得两个步骤,我们已经构造了网格状的RadioGroup,下面我们将通过一个PopupWindow将其显示出来。
//注意,PopupWindow的第一个参数必须是没有父亲的view对象即顶层View。
mPopGridRadioGroup = new PopupWindow(mViewGroup, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT,true);
mPopGridRadioGroup.setBackgroundDrawable(new BitmapDrawable());
mPopGridRadioGroup.setTouchInterceptor(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
            mPopGridRadioGroup.dismiss();
            return true;
        }
        return false;
    }
});

mPopGridRadioGroup.showAtLocation(findViewById(R.id.mainView), Gravity.CENTER, 0, 0);
mPopGridRadioGroup.update();        
 

到此我们就实现了网格状排列的RadioGroup。 

 

上传源代码打包

 

分享到:
评论

相关推荐

    Andriod: 网格状RadioGroup的实现

    本篇文章将深入探讨如何在Android中实现网格状的RadioGroup。 首先,我们需要理解`RadioGroup`和`GridView`的基本概念。`RadioGroup`是Android SDK提供的一种可以容纳多个单选按钮的容器,用户在其中只能选择一个...

    Android 自定义RadioGroup布局,修改源码自定义控件

    5. **自定义布局参数**:如果需要支持不同的布局类型,如网格布局,我们可以创建自定义的布局参数类,继承自`RadioGroup.LayoutParams`,并添加必要的属性来控制布局的样式。 6. **测试与优化**:完成自定义`...

    RadioGroup多列显示

    例如,以下是一个简单的XML布局文件,展示了如何创建一个2列的RadioGroup: ```xml xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/radio_group" android:layout_width="match_...

    android基础控件使用

    在Android开发中,基础控件是构建用户界面(UI)的核心元素。这些控件使得开发者能够创建各种交互式和功能丰富的应用。以下是一些主要的Android基础控件及其使用方法的详细说明: 1. **按钮(Button)** - `Button`...

    android控件用法

    理解并熟练使用这些基本控件是Android开发的基础,它们可以帮助你创建出功能丰富的用户界面。 对于初学者来说,建议通过实践项目来熟悉这些控件,同时,查阅官方文档和在线教程,以便更深入地了解每个控件的特性和...

    Android中的常用控件

    本文将深入探讨Android中的一些常用控件,以及如何利用这些控件来创建功能丰富的用户界面。 1. Button(按钮):按钮是用户界面中最常见的控件之一,用于触发一个操作或事件。在XML布局中,我们可以通过`&lt;Button&gt;`...

    用radiogroup和gridview模拟tabhost

    在Android应用开发中,`TabHost`是一种常用的组件,它允许开发者在界面上创建可切换的标签页。然而,随着Android SDK的更新,`TabHost`逐渐被更现代的导航模式如`FragmentTabHost`和`BottomNavigationView`所取代。...

    MyAndroidExample

    10. **网格布局(GridLayout)**:将子视图按照行列进行排列,方便创建棋盘或矩阵布局。 ```xml android:layout_width="match_parent" android:layout_height="wrap_content"&gt; &lt;!-- 添加你的子视图在这里 --&gt; ...

    第02章 Android简单控件的开发及应用

    12. **GridLayout**:GridLayout按照网格布局控件,每个子视图占据一定的格子,通过`android:rowCount`和`android:columnCount`设置行数和列数。 在实际开发中,开发者需要根据需求灵活组合使用这些控件,同时掌握...

    Android多选框效果

    在Android XML布局文件中,可以使用`&lt;android.widget.CheckBox&gt;`标签来创建一个多选框。最基本的用法如下: ```xml android:id="@+id/my_checkbox" android:layout_width="wrap_content" android:layout_height...

    Android各控件及界面布局介绍

    5. **GridLayout**:网格布局,以表格形式排列子元素,适合创建具有多列布局的应用程序。 6. **CoordinatorLayout**:协调布局,提供了一种机制来处理多个View之间的交互和行为,比如底部导航栏和浮动操作按钮之间的...

    Android所有UI控件

    GridLayout按网格排列子视图,每行和每列的视图数量可以预设。 9. **Spinner** Spinner是下拉选择框,通常用于提供多个选项供用户选择。`android:entries`属性定义选项列表。 10. **Checkbox** Checkbox是复选...

    android常用系统控件

    通过`&lt;ImageView&gt;`标签创建,`android:src`设置图片源,`android:scaleType`控制图片缩放方式。 8. **列表(ListView)**和**RecycleView**:用于显示多行数据的容器。ListView是早期版本的组件,而RecycleView在性能...

    android控件

    它通常配合RadioGroup使用。在XML布局中,`&lt;RadioButton&gt;`标签定义单选按钮,`android:text`设置文字,`android:checked`决定默认选中状态。 四、复选框(CheckBox) CheckBox控件允许用户进行多选。例如,在设置中,...

    自定义RadioGroup

    在Android开发中,`RadioGroup`控件通常用于实现单选按钮(RadioButton)的互斥选择,即用户只能选择其中一个选项。然而,默认的`RadioGroup`仅支持一行显示且无法直接实现多行多列的布局效果。为了满足设计需求,...

    Android程序研发源码Android 多种android控件的Demo.rar

    它们属于RadioGroup和CheckBoxGroup的成员,通过`&lt;RadioButton&gt;`和`&lt;CheckBox&gt;`标签创建,通过`android:checked`控制初始状态。 4. **图像视图(ImageView)**:展示图片资源,常用于图标或背景。通过`&lt;ImageView&gt;`...

    android笔记

    - **GridView**: 网格视图,类似于ListView,但以网格形式展示数据。 - **ImageSwitcher**: 用于快速切换图像。 - **Gallery**: 画廊视图,类似于旋转木马。 - **ExpandableListView**: 可展开列表视图,允许某些...

    Android实验指导(1).doc

    布局(Layout)是组织控件的关键,Android提供了多种布局方式,如AbsoluteLayout(绝对布局)、FrameLayout(帧布局)、GridView(网格布局)、LinearLayout(线性布局)、ListLayout(列表布局)、RadioGroup(单选...

    AndroidAPI中文版

    它们属于`RadioGroup`的一部分,`RadioGroup`可以管理一组单选按钮,确保同一时间内只有一个按钮被选中。 6. **ListView**: 显示可滚动的列表项,常用于显示大量数据。结合`Adapter`使用,可以将数据源绑定到列表...

    Android2.2 API中文文档——View

    - **RadioGroup**:单选按钮组视图,包含一组互斥的`RadioButton`。 - **RatingBar**:评分条视图,用于展示星级评价。 - **ScrollView**:滚动视图,可以滚动其包含的单一子视图。 - **SeekBar**:滑动条视图,用于...

Global site tag (gtag.js) - Google Analytics