`

实现类似RadioGroup,RadioButton的自定义控件实现

 
阅读更多

题目可能没看懂,直接上效果图:

 

 

 

 

(1)主程序:

package com.example.radiogrouptest;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class SearchMovieActivity extends Activity {
	private GridView gridViewType;
	private GridView gridViewArea;
	private GridView gridViewTime;
	private TextView title;
	private Button back;
	private Button rightBT;
	private OnClickListener MyOnClickListener;
	private SimpleAdapter adater1;
	private SimpleAdapter adater2;
	private SimpleAdapter adater3;
	private ArrayList<HashMap<String, Object>> mList1;
	private ArrayList<HashMap<String, Object>> mList2;
	private ArrayList<HashMap<String, Object>> mList3;
	private static final int listContent1[] = {R.string.search_type_all,R.string.search_type_love,
		R.string.search_type_biography,R.string.search_type_cartoon,R.string.search_type_action,
		R.string.search_type_ancient,R.string.search_type_child,R.string.search_type_dance,
		R.string.search_type_family,R.string.search_type_frightened,R.string.search_type_terror,
		R.string.search_type_fiction,R.string.search_other};
	private static final int listContent2[] = {R.string.search_type_all,R.string.search_area_china,
		R.string.search_area_china_hk,R.string.search_area_usa,R.string.search_area_europe,
		R.string.search_area_kj,R.string.search_area_tailand,R.string.search_other};
	private static final int listContent3[] = {R.string.search_time_all,R.string.search_time_2013,
		R.string.search_time_2012,R.string.search_time_2011,R.string.search_time_2010,
		R.string.search_time_2000,R.string.search_time_90,R.string.search_time_other};
	private static final int TYPE_NUM = 13;
	private static final int AREA_NUM = 8;
	private static final int TIME_NUM = 8;
	private int typeLastItem = 0;
	private int areaLastItem = 0;
	private int timeLastItem = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		initMainUI();
	}
	
	private void initMainUI() {
		setContentView(R.layout.activity_search2);
		
		initGridViewOne();
		initGridViewTwo();
		initGridViewThree();
	}
	
	private void initGridViewOne() {
		gridViewType = (GridView)findViewById(R.id.search_type);
		mList1 = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < TYPE_NUM; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("radioIcon", R.drawable.btn_radio_off);//radiobutton_off
			map.put("radioText", getString(listContent1[i]));
			mList1.add(map);
		}
		adater1 = new SimpleAdapter(getApplicationContext(), mList1, R.layout.search_grid_item, 
				new String[]{"radioIcon","radioText"}, new int[]{R.id.item_RadioImg,R.id.item_RadioText});
		if (gridViewType != null) {
			gridViewType.setAdapter(adater1);
			gridViewType.requestFocus();
			gridViewType.setOnItemClickListener(new MyTypeOnItemClick());
		}
	}
	
	private void initGridViewTwo() {
		gridViewArea = (GridView)findViewById(R.id.search_area);
		mList2 = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < AREA_NUM; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("radioIcon", R.drawable.btn_radio_off);
			map.put("radioText", getString(listContent2[i]));
			mList2.add(map);
		}
		adater2 = new SimpleAdapter(getApplicationContext(), mList2, R.layout.search_grid_item, 
				new String[]{"radioIcon","radioText"}, new int[]{R.id.item_RadioImg,R.id.item_RadioText});
		if (gridViewArea != null) {
			gridViewArea.setAdapter(adater2);
			gridViewArea.requestFocus();
			gridViewArea.setOnItemClickListener(new MyAreaOnItemClick());
		}
	}
	
	private void initGridViewThree() {
		gridViewTime = (GridView)findViewById(R.id.search_time);
		mList3 = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < TIME_NUM; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("radioIcon", R.drawable.btn_radio_off);
			map.put("radioText", getString(listContent3[i]));
			mList3.add(map);
		}
		adater3 = new SimpleAdapter(getApplicationContext(), mList3, R.layout.search_grid_item, 
				new String[]{"radioIcon","radioText"}, new int[]{R.id.item_RadioImg,R.id.item_RadioText});
		if (gridViewTime != null) {
			gridViewTime.setAdapter(adater3);
			gridViewTime.requestFocus();
			gridViewTime.setOnItemClickListener(new MyTimeOnItemClick());
		}
	}
	
	
	
	
	private void changeItemImg(SimpleAdapter sa, int selectedItem, boolean isOn) {
		HashMap<String, Object> map = (HashMap<String, Object>)sa.getItem(selectedItem);
		if (isOn) {
			map.put("radioIcon", R.drawable.btn_radio_on);
		} else {
			map.put("radioIcon", R.drawable.btn_radio_off);
		}
		sa.notifyDataSetChanged();
	}
	
	private class MyTypeOnItemClick implements OnItemClickListener {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			// TODO Auto-generated method stub
			System.out.println("search_type");
			if (typeLastItem != position) {
				if (typeLastItem >= 0) {
					changeItemImg(adater1, typeLastItem, false);
				}				
			}
			
			
			changeItemImg(adater1, position, true);	
			HashMap<String, Object> map = (HashMap<String, Object>)adater1.getItem(position);
			String typeStr = (String)map.get("radioText");
			System.out.println("Type string:"+typeStr);
			

			typeLastItem = position;
		}		
	}
	
	private class MyAreaOnItemClick implements OnItemClickListener {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			// TODO Auto-generated method stub			
			System.out.println("search_area");
			if (areaLastItem != position) {
				if (areaLastItem >= 0) {
					changeItemImg(adater2, areaLastItem, false);
				}				
			}
			
			changeItemImg(adater2, position, true);
			HashMap<String, Object> map = (HashMap<String, Object>)adater2.getItem(position);
			String areaStr = (String)map.get("radioText");
			System.out.println("Area string:"+areaStr);
			
			areaLastItem = position;
		}		
	}
	
	private class MyTimeOnItemClick implements OnItemClickListener {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			// TODO Auto-generated method stub			
			System.out.println("search_time");
			if (timeLastItem != position) {
				if (areaLastItem >= 0) {
					changeItemImg(adater3, timeLastItem, false);
				}				
			}
			timeLastItem = position;
			changeItemImg(adater3, position, true);
			HashMap<String, Object> map = (HashMap<String, Object>)adater3.getItem(position);
			String timeStr = (String)map.get("radioText");
			System.out.println("Time string:"+timeStr);
		}		
	}
	
}

 

 

(2)布局文件activity_search2.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/main_bg">
    
		<RelativeLayout
		    android:layout_width="fill_parent"
		    android:layout_height="fill_parent"
		    android:layout_below="@+id/head">
		<!-- 类型 -->
			<LinearLayout
				    android:id="@+id/linearOne"
			        android:layout_width="fill_parent"
			        android:layout_height="wrap_content"
			        android:orientation="vertical" 
			        >		    
		        <TextView
		            android:id="@+id/leixing"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:text="@string/search_type_one"
		            android:textSize="18.0sp"
					android:textColor="#FF1EA5E4" 
		            />
		        <View
		            android:id="@+id/line1"
		            android:layout_width="fill_parent"
		            android:layout_height="1px"
		            android:background="@color/p6" 
		            />
		        <GridView 
		            android:id="@+id/search_type"
		            android:layout_width="fill_parent"
		            android:layout_height="wrap_content"
		            android:numColumns="auto_fit"
			        android:verticalSpacing="10dp"
			        android:horizontalSpacing="1dp"
			        android:columnWidth="60dp"
			        android:stretchMode="columnWidth"
			        android:gravity="center"
			        android:layout_marginTop="5dip"
		            >		            
		        </GridView>
		    </LinearLayout>		            
		<!-- 地区 --> 
			<LinearLayout
			    android:id="@+id/linearTwo"
		        android:layout_width="fill_parent"
		        android:layout_height="wrap_content"
		        android:layout_below="@+id/linearOne"
		        android:orientation="vertical" 
		        >
		        <View
		            android:layout_width="fill_parent"
		            android:layout_height="1px"
		            android:background="@color/p6" 
		            />
		        <TextView
		            android:id="@+id/area"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:text="@string/search_type_two"
		            android:textSize="18.0sp"
					android:textColor="#FF1EA5E4" 
		            />
		        <View
		            android:layout_width="fill_parent"
		            android:layout_height="1px"
		            android:background="@color/p6" 
		            />
		        <GridView 
		            android:id="@+id/search_area"
		            android:layout_width="fill_parent"
		            android:layout_height="wrap_content"
		            android:numColumns="auto_fit"
			        android:verticalSpacing="10dp"
			        android:horizontalSpacing="1dp"
			        android:columnWidth="60dp"
			        android:stretchMode="columnWidth"
			        android:gravity="center"
			        android:layout_marginTop="5dip"
		            >		            
		        </GridView>
		    </LinearLayout>
		<!-- 年份 -->
			<LinearLayout
			    android:id="@+id/linearThree"
		        android:layout_width="fill_parent"
		        android:layout_height="wrap_content"
		        android:layout_below="@+id/linearTwo"
		        android:orientation="vertical" 
		        >
		        <View
		            android:layout_width="fill_parent"
		            android:layout_height="1px"
		            android:background="@color/p6" 
		            />
		        <TextView
		            android:id="@+id/time"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:text="@string/search_type_three"
		            android:textSize="18.0sp"
					android:textColor="#FF1EA5E4" 
		            />
		        <View
		            android:layout_width="fill_parent"
		            android:layout_height="1px"
		            android:background="@color/p6" 
		            />
		        <GridView 
		            android:id="@+id/search_time"
		            android:layout_width="fill_parent"
		            android:layout_height="wrap_content"
		            android:numColumns="auto_fit"
			        android:verticalSpacing="10dp"
			        android:horizontalSpacing="1dp"
			        android:columnWidth="85dp"
			        android:stretchMode="columnWidth"
			        android:gravity="center"
			        android:layout_marginTop="5dip"
		            >		            
		        </GridView>
		        <View
		            android:layout_width="fill_parent"
		            android:layout_height="1px"
		            android:background="@color/p6" 
		            />
		    </LinearLayout>    
		</RelativeLayout>
</RelativeLayout>

 

 

(3) 每个item的布局文件search_grid_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dip"
    android:background="@color/main_bg"
    android:orientation="horizontal"
    android:gravity="center">
    <ImageView
        android:id="@+id/item_RadioImg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/btn_radio"
        />
    <TextView
        android:id="@+id/item_RadioText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/search_type_all" 
        android:textColor="#000000"
        android:textSize="15sp"
        />
</LinearLayout>

 

 

(4)串人配置文件strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">RadioGroupTest</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>

    <string name="search_type_one">类型</string>
    <string name="search_type_two">地区</string>
    <string name="search_type_three">年代</string>
    
    
    <!-- 类型 -->
    <string name="search_type_all">全部</string>
    <string name="search_type_love">爱情</string>
    <string name="search_type_biography">传记</string>
    <string name="search_type_cartoon">动画</string>
    <string name="search_type_action">动画</string>
    <string name="search_type_ancient">动作</string>
    <string name="search_type_child">儿童</string>
    <string name="search_type_dance">歌舞</string>
    <string name="search_type_family">家庭</string>
    <string name="search_type_frightened">惊悚</string>
    <string name="search_type_terror">恐怖</string>
    <string name="search_type_fiction">科幻</string>
    <string name="search_other">其它</string>
    
    <!-- 地区 -->
    <string name="search_area_china">大陆</string>
    <string name="search_area_china_hk">香港</string>
    <string name="search_area_usa">美国</string>
    <string name="search_area_europe">欧洲</string>
    <string name="search_area_kj">日韩</string>
    <string name="search_area_tailand">泰国</string>
    
    <!-- 年代 -->
    <string name="search_time_all">全部</string>
    <string name="search_time_2013">2013年</string>
    <string name="search_time_2012">2012年</string>
    <string name="search_time_2011">2011年</string>
    <string name="search_time_2010">2010年</string>
    <string name="search_time_2000">2000年</string>
    <string name="search_time_90">90年代</string>
    <string name="search_time_other">其它年代</string>
    
</resources>

 

 

(5)颜色配置文件color.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    
    <color name="main_bg">#eeeeee</color>
    <color name="p6">#41a6f2</color>
    
</resources>

 

 

(6)on , off图标,我是从sdk里取出来的:

F:\develop_installed_software\adt-bundle-windows-x86_64-20130219\sdk\platforms\android-7\data\res\drawable-hdpi\btn_radio_off.png

 

adt-bundle-windows-x86_64-20130219文件夹一搜索btn_radio_off,btn_radio_on一堆button图标出来,自己随便挑.

 

代码见附件

 

 

 

 

  • 大小: 109.3 KB
  • 大小: 2.7 KB
  • 大小: 2.4 KB
分享到:
评论

相关推荐

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

    本文将深入探讨如何自定义`RadioGroup`布局,并通过修改源码来创建一个自定义控件。`RadioGroup`是Android系统中用于管理多个单选按钮(`RadioButton`)的容器,通常限制用户只能选择其中一项。 首先,理解`...

    Android ViewPager+RadioGroup 自定义控件示例

    本示例旨在教你如何将这些组件结合使用,创建一个自定义控件,以实现上部导航和主页面导航的功能。以下是关于这三个组件的详细解释以及如何在实际项目中进行集成。 1. **ViewPager**:`ViewPager`是Android支持库中...

    Android自定义控件.pdf

    通过以上介绍,我们可以看出Android自定义控件不仅能够帮助开发者实现更加个性化的界面设计,还能够提供更为丰富和灵活的交互体验。掌握自定义控件的技术对于成为一名优秀的Android开发者来说是非常重要的。

    动态添加RadioGroup的RadioButton.zip

    通过源码学习,我们可以看到这些API的实现细节,了解它们是如何协同工作的,这对于优化性能、解决潜在问题以及自定义控件的行为都非常有帮助。在这个过程中,你可能还会遇到一些概念,如View的测量和布局流程、事件...

    Android学习笔记七:基本视图组件:RadioGroup和RadioButton

    这篇“Android学习笔记七:基本视图组件:RadioGroup和RadioButton”深入探讨了这两个组件的使用和实现方式。 首先,RadioButton是Android中的一种选择控件,它允许用户在多个选项中选择一个。每个RadioButton通常...

    android 高仿微信底部菜单 用自定义的radiobutton和radiogroup实现,能实现气泡数字的效果

    2. **自定义RadioGroup**: 我们可能需要监听每个RadioButton的点击事件,以便更新其他控件或者进行相应的逻辑处理。可以通过重写RadioGroup的onCheckedChanged()方法来实现。此外,我们还需要管理气泡数字的状态,...

    Android RadioGroup和RadioButton控件简单用法示例

    总结来说,Android的RadioGroup和RadioButton控件是实现单选功能的关键组件。通过RadioGroup,我们可以方便地管理多个RadioButton,确保用户只能选择其中一项。在实际应用中,可以根据需要自定义更多选项,或者使用...

    Android进阶之RadioButton选中值的获取、单选多行

    在Android开发中,`RadioButton`和`RadioGroup`是实现单选功能的重要组件。`RadioButton`作为单选按钮,通常用于提供多个可选项中的一个,而`RadioGroup`则作为一个容器,用来管理这些`RadioButton`,确保一次只能有...

    自定义开关按钮控件

    总结来说,通过组合RadioButton和RadioGroup,我们可以创建出一个具有开关功能的自定义控件。这不仅展示了Android组件的灵活性,也为开发者提供了更大的创新空间。通过不断实践和探索,你可以创造出更多富有创意和...

    动态添加RadioGroup的RadioButton

    在Android开发中,`RadioGroup`是一个非常常用的布局控件,它用于管理一组`RadioButton`,使得在同一时间只能有一个单选按钮被选中。本文将深入探讨如何在运行时动态地向`RadioGroup`中添加`RadioButton`,并结合...

    换行的RadioGroup可以使用

    4. **自定义控件**:`FlexRadioGroup-master`可能是一个开源项目,提供了自定义的`RadioGroup`实现,以支持换行和其他高级功能。使用这种自定义控件,开发者无需处理复杂的布局逻辑,只需直接引入库并按照其文档使用...

    安卓开发-动态添加RadioGroup的RadioButton.zip.zip

    本示例着重讲解如何动态地在RadioGroup中添加RadioButton控件。RadioGroup是一个容器,用于管理多个RadioButton,使得同一时间只能有一个RadioButton被选中。 首先,我们需要了解RadioGroup和RadioButton的基本用法...

    自定义RadioButton

    在设计自定义控件时,需要注意这两者之间的逻辑差异。 8. **自定义属性**:通过定义自定义属性并使用`&lt;declare-styleable&gt;`标签,可以在XML布局中直接使用这些属性,简化代码并增强可复用性。 9. **动态添加...

    RadioGroup实现仿新浪微博的效果

    在Android开发中,RadioGroup是一个常用的布局控件,它用于管理一组RadioButton,使得在同一时间只能有一个RadioButton被选中。在这个场景中,我们将讨论如何利用RadioGroup来实现一个类似新浪微博的界面效果,即...

    仿美团支付自定义radiobutton

    最后,将这个自定义的RadioButton用在你的支付方式选择界面,通过设置不同的数据和事件处理,实现类似美团支付页面的切换效果。在布局文件中使用自定义的RadioButton,替换默认的RadioButton,并为其设置相应的属性...

    07-android 单选按钮 RadioButton

    RadioButton与RadioGroup的交互是通过监听器(OnCheckedChangeListener)来实现的,当用户点击RadioButton时,系统会触发监听器的事件,开发者可以通过这个事件来处理用户的选中操作。 要创建RadioButton,首先需要...

    好看的自定义radiobutton

    总的来说,这个主题涵盖了Android UI自定义、RadioButton和RadioGroup的使用、自定义事件处理以及可能的复杂布局设计。开发者需要具备扎实的Android基础知识,包括视图绘制、事件监听以及布局管理。通过这样的自定义...

    自定义RadioGroup

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

    android实现自定义tab页

    通过以上步骤,我们就可以使用RadioButton实现一个非源生风格的自定义Tab页了。这种方式灵活性高,可以根据需求调整Tab的样式和交互方式,为用户提供更个性化的体验。记得在实际项目中,还要考虑兼容性、性能优化...

Global site tag (gtag.js) - Google Analytics