Android打造个性十足的组件技术之复合组件
- 博客分类:
- 技术杂绘
在Android中,我们可以通过继承View来打造完全如我们所愿的组件,但是,有的时候,我们需要的组件是一个由现有的几个组件的组合实现的,那么我们就可以利用组件合成技术,呵呵,这个名字我自己起的。
在Android中打造复合组件,其实只需要继承Layout或者其子类,比如LinearLayout等,然后在其中定义需要完成该功能的现有的几个组件。
然后定义一个监听器(就是一个简单的接口,暴露给用户使用,获取返回的数据,给用户使用)
本文通过使用两个Spinner来打造一个省份城市信息联动的选择控件,省份和城市信息的联动是开发中经常遇到的,这里我们看看使用组件合成技术如何简单巧妙的实现该功能。本例是雏形,强大的功能待大家完善。
闲话少说,直接上实例:
1、自定义一个CitySpinner,代码: package demo.spinner; import java.util.ArrayList; import java.util.HashMap; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; /** * 自定义复合组件,实现省份城市联动Spinner组件 * 定义复合组件通常继承自Layout,不必重写onDraw,onMesure等方法,除非有特殊的需求 * @author Administrator * */ public class CitySpinner extends LinearLayout { private Context context; private Spinner mProvinceSpinner, mCitySpinner; private HashMap> proCities; //存放数据 private ArrayList provinces; private OnCitySelectListener cityListener; private AdapterView.OnItemSelectedListener provinceSelectListener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView p, View v, int position, long id) { // 在选择了一个省份后,我们需要更新对应的城市列表 String currProvince = (String)p.getItemAtPosition(position); ArrayList cities = proCities.get(currProvince); ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item,cities); adapter.setDropDownViewResource(android.R.layout.s imple_dropdown_item_1line); mCitySpinner.setAdapter(adapter); } @Override public void onNothingSelected(AdapterView arg0) { // TODO Auto-generated method stub } }; private AdapterView.OnItemSelectedListener citySelectListener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView p, View v, int position, long id) { if(cityListener != null){ //这里获取当前选择的省份和城市 String province = (String)mProvinceSpinner.getSelectedItem(); String city = (String)p.getItemAtPosition(position); cityListener.onCitySelected(province, city); } } @Override public void onNothingSelected(AdapterView arg0) { // TODO Auto-generated method stub //Do nothing; } }; public CitySpinner(Context context, HashMap> data){ super(context); this.context = context; this.setOrientation(HORIZONTAL); //水平布局 //然后设置省份Spinner的数据 mProvinceSpinner = new Spinner(context); mCitySpinner = new Spinner(context); //添加监听 mProvinceSpinner.setOnItemSelectedListener(provinc eSelectListener); mCitySpinner.setOnItemSelectedListener(citySelectL istener); if(data != null){ this.proCities = data; provinces = new ArrayList(); Object[] temps = proCities.keySet().toArray(); for(int i=0; i adapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item,provinces); adapter.setDropDownViewResource(android.R.layout.s imple_dropdown_item_1line); mProvinceSpinner.setAdapter(adapter); } this.addView(mProvinceSpinner,LayoutParams.WRAP_CO NTENT,LayoutParams.WRAP_CONTENT); this.addView(mCitySpinner,LayoutParams.WRAP_CONTEN T, LayoutParams.WRAP_CONTENT); } public CitySpinner(Context context, HashMap> data, AttributeSet attrs){ super(context, attrs); } public Spinner getmProvinceSpinner() { return mProvinceSpinner; } public void setmProvinceSpinner(Spinner mProvinceSpinner) { this.mProvinceSpinner = mProvinceSpinner; } public Spinner getmCitySpinner() { return mCitySpinner; } public void setmCitySpinner(Spinner mCitySpinner) { this.mCitySpinner = mCitySpinner; } public void setOnCitySelectListener(OnCitySelectListener listener){ this.cityListener = listener; } } 2、该代码中使用到了一个监听器OnCitySelectListener,其实就是一个简单的接口,在用户使用的时候,由用户来具体实现。 /** * 选择事件监听器 * @author Administrator * */ public interface OnCitySelectListener { public void onCitySelected(String province, String city); } 3、测试代码,目前不能再配置文件中使用该控件,只能在代码中使用,如何使其能在配置文件中使用,也很简单。后期待完成。代码: package demo.spinner; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.Toast; public class DemoActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); HashMap> data = new HashMap>(); for(int i=0; i cities = new ArrayList(); for(int j=0; j组件合成技术,如此简单而已!
发表评论
-
Python学习---字符串操作
2012-07-06 09:52 599主要参考内容还是官方的帮助文档。在使用过程中逐步深入。 ' ... -
正则表达式不包含属性
2012-07-06 09:45 725转载于: http://www.jb51.net/arti ... -
17种常用正则表达式
2012-07-06 09:37 607说明 文本格式: /pattern/flags ... -
BarManage --- 菜单
2012-07-06 09:30 641个人开发遇到的问题;个人开发中的感受;好文章节录,找有用的 ... -
求时间差(天数)
2012-07-05 20:45 574function diffdate() { var sy ... -
FLEX4中怎样设置背景,及惭变色
2012-07-02 10:48 659width="100%"> ... -
ArcGIS Flex API读取MapABC中的地图
2012-07-02 10:48 583实现方式同读取googleMap中的地图,废话不多说,源码 ... -
flex学习-----AdvancedDataGrid
2012-07-02 10:48 523一、AdvancedDataGrid绑定xml wi ... -
Flex: DataGroup 组件增加滚动条
2012-07-02 10:48 553本想用mx:List 实现一个联系人列表,无奈AS4不知怎 ... -
Cairngorm文档--模块化示例程序解读
2012-07-01 00:27 485模块化示例程序解 ... -
Flash builder 4.5支持Android平台之初体验
2012-07-01 00:27 540Flash builder 4.5可以 ... -
历年工作主要专业技术总结
2012-07-01 00:27 563自从大学毕业以来 ... -
使用Flare3D在FB中搭建第一个Molehill项目
2012-07-01 00:27 658本文介绍如何使用第三方开发框架Flare 3D 2.0在F ...
相关推荐
文档主要是讲Android开发的四大组件详解,包含 Activity详解 ,Service详解,Broadcast Receiver详解,Content Provider详解 外加一个重要组件 intent的详解。 文章内容来自网络,本文是一个总结性文章。
Android应用开发的哲学是把一切都看作是组件。把应用程序组件化的好处是降低模块间的耦合性,同时提高模块的复用性。Android的组件设计思想与传统的组件设计思想最大的区别在于,前者不依赖于进程。也就是说,进程...
Android组件TimePicker组件的深入解析,自定义TimePicker组件
AndroidStudio项目组件化,便于大型项目团队并行开发。项目中集成路由框架,友盟统计,腾讯Bugly日志,
android组件,对android常用组件的解释 android组件,对android常用组件的解释
030_Android UI组件之 GridView组件,很细致的视频教程,这个可以学哦。
android安卓组件库android安卓组件库android安卓组件库
Android UI控件组件库集合【源码】 热门标签,流式布局,刮刮乐控件,侧滑控件,循环幻灯片控件,自动换行控件,下拉列表,圆角进度控件等常用UI控件组件合集
axure 的Android-L组件库,比较全
制作Android天气预报的组件:日期组件和天气组件源码,我把Android中的一个天气组件和一个日期组件写在了一个VIEW组件中,我自己觉得用着挺方便,可以在用的时候,直接拖放到你的项目中。本实例包的源码是一个包括了...
Android_UI_组件介绍.pdf Android_UI_组件介绍.pdf
Android的开发组件 为Android的爱好者提供 清晰明了的Android机制框架 介绍四大组件
Android四大组件简述demo用例。
Android 自定义复合组件样例源码,主要实现:扩展LinearLayout 为其加一个ImageButton 和 TextView 使其具有混合功能的效果,并为各自组件添加get/set 方法,并为ImageButton 设置监听使其的功能跟我们后面要使用的...
android\深入Android 组件入门android\深入Android 组件入门android\深入Android 组件入门android\深入Android 组件入门
axure android ios高保真组件
Android Axure组件库,最新版本,全新下载,欢迎下载
此文档涵盖了android四大组件,所有的基础应用介绍,并且还有补充说明
使用ijkplayer,实现一个仿B站的Android客户端。使用组件化的思想对项目进行拆分,目前分出两个组件,一个是网络请求组件,一个是视频播放组件。
详解 Android 的 Activity 组件,详解 Android 的 Activity 组件