1、第四章 Android UI编程 (三),本章目标,单选、复选、时间控件的使用 进度条和拖动条的使用 列表控件以及列表适配器 理解View与数据的适配器接口的关系 Android对话框的使用 切换卡TabWidget的使用 选项菜单的使用 掌握Android 窗口属性和控制,单选组件RadioGroup/RadioButton,在布局文件中将RadioButton包含在RadioGroup中 RadioGroup中的onCheckedChangeListener监听变化看示例:ViewsDemo项目:com.great.views.RadioButton_RadioGroup_Demo1.ja
2、va,示例:RadioButton,在布局配置文件的片段,示例:RadioButton续,在Activity代码中片段 rb1 = (RadioButton)this.findViewById(R.id.rb1); rb2 = (RadioButton)this.findViewById(R.id.rb2); rg = (RadioGroup)this.findViewById(R.id.rg); rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() Override public void onCheck
3、edChanged(RadioGroup rg, int checkId) / TODO Auto-generated method stub if(checkId=rb1.getId()System.out.println(rb1.getText(); elseSystem.out.println(rb2.getText(); );,复选框CheckBox,onCheckedChangeListener(CompoundButton buttonView,boolean isChecked)监听每个复选项 buttonView是被点击的选项 isChecked表示是否被打钩看示例:Views
4、Demo项目:com.great.views.CheckBoxDemo1.java,时间DatePicker/TimePicker,DatePicker 的使用步骤 创建DatePicker控件(配置文件或new) 得到Calender.getInstance获得日历对象 对DatePicker对象进行初始化 mDatePicker.init(c.get(Calender.YEAR), c.get(Calender.MONTH), c.get(Calender.DAYOFMONTH),new DatePicker.onDateChangedListener(); DatePickerDialo
5、g 为日期对话框 构造函数: DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) 显示对话框:Show() TimePicker 的使用步骤 创建TimePicker控件(配置文件或new) 常用方法: setIs24HourView、 setCurrentHour、 setCurrentMinute TimePickerDialog 为时间对话框 构造函数:TimePickerDialog(Context context, OnTime
6、SetListener callBack, int hourOfDay, int minute, boolean is24HourView) 显示对话框:Show() 看示例:ViewsDemo项目:com.great.views.DatePicker_TimePicker_Demo1.java,DatePicker 示例,DatePicker dpTime = (DatePicker) this.findViewById(R.id.dpTime);Calendar c = Calendar.getInstance();dpTime.init(c.get(Calendar.YEAR), c.g
7、et(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH),new DatePicker.OnDateChangedListener() Override public void onDateChanged(DatePicker dp, int year, int month, int dayofmonth) StringBuilder sb = new StringBuilder(); sb.append(year); sb.append(“-“); sb.append(month); sb.append(“-“); sb.append(dayofmont
8、h); System.out.println(sb); );,其他时间控件,AnalogClock 模拟钟(带表盘的那种)这是一个带有时针和分针的模拟时钟控件 DigitalClock 数字钟(电子表的那种)看示例:ViewsDemo项目:com.great.views.AnalogClock_DigitalClock_Demo1.java,列表视图ListView,列表视图控件是对数据进行列表显示 需要如下三个组件构成: 控件本身 实现ListAdapter接口的数据提供者 每个列表Item的布局文件,11,ListAdapter接口,是绑定Data和ListView的适配器,是一个接口 实
9、现ListAdapter接口的类 BaseAdapter 实现了ListAdapter和SpinnerAdapter的接口,并提供每个itemview的生成,即实现View getView(int position, View convertView, ViewGroup parent) ArrayAdapter 数组与ListView的接口 SimpleAdapter ArrayList和 ListView的桥梁,ArrayList中每一个元素都是Map类型,12,示例:ArrayAdapter,代码文件: String item = “aaa“,“bbb“,“ccc“; ListView
10、lv = this.findViewById(R.id.lv); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,item ); lv.setAdapter(adapter);lv.setOnItemClickListener(new AdapterView.OnItemClickListener() Override public void onItemClick(AdapterView av, View view, int seq, long arg3) MainActivi
11、ty.this.display(itemseq); 看示例:ViewsDemo项目:com.great.views.ListView_ArrayAdapter_Demo1.java,示例:SimpleAdapter,代码文件中:lv = (ListView) this.findViewById(R.id.lv); ArrayList listContent= new ArrayList(); Map map; for(int i=0;i();(HashMap)map).put(“aa“, “user“+String.valueOf(i);(HashMap)map).put(“bb“, “ite
12、m“+String.valueOf(i);listContent.add(map); SimpleAdapter adapter = new SimpleAdapter(this, listContent, R.layout.listitem, new String“aa“,“bb“, new intR.id.tv1,R.id.tv2); lv.setAdapter(adapter);看示例:ViewsDemo项目: com.great.views.ListView_SimpleAdapter_Demo1.java,示例:SimpleAdapter续,/布局资源文件listitem.xml,自
13、定义适配器,private class GridItemAdapter extends BaseAdapter private Context context; private List resInfo; /构造函数 public GridItemAdapter(Context c,List res) context = c; resInfo = res; Override public View getView(int position, View convertView, ViewGroup parent) View convertView = LayoutInflater.from(co
14、ntext) .inflate(R.layout.application_layout, null); return convertView; ,下拉列表Spinner,通过ArrayAdapter将ArrayList与Spinner联系起来 将用户要选择的内容显示在TextView 显示的布局:自定义或系统定义R.layout.simple_spinner_item setDropDownViewResource设置下拉的view显示 setOnItemSelectedListener设置监听器来监听用户选择的变化 通过监听方法带过来的ItemView.setVisibility方法设置当前
15、选中的项 看示例:ViewsDemo项目: com.great.views.SpinnerDemo1.java com.great.views.SpinnerDemo2.java com.great.views.SpinnerDemo3.java,17,拖动条 SeekBar,拖动条要被用户控制,设置监听器SeekBar.OnSeekBarChangeListener 监听器接口要求实现如下三个方法: onProgressChanged 数据改变时 获取拖动条当前值 onStartTrackingTouch 开始拖动 onStopTrackingTouch 停止拖动看示例:ViewsDemo项
16、目: com.great.views.SeekBar_Demo1.java,进度条ProcessBar,系统提供两种的进度条样式: 长形progressBarStyleHorizontal 圆形progressBarStyleLarge style=“?android:attr/ progressBarStyleLarge”进行引用 主要方法 setMax:进度条最大值 setProgress:进度条当前值 setVisibility:设置可见性看示例:ViewsDemo项目: com.great.views.ProgressBar_Demo1.java com.great.views.Pro
17、gressBar_Demo2.java,对话框Dialog属性,通过内嵌类AlertDialog.Builder来创建 create():创建对话框 setTitle():设置标题 setIcon():设置图标 setMessage():设置提示信息 setItems():设置一个列表 setSingleChoiceItems():对话框单选列表 setMultiChoiceItems():对话框多选列表 setView():设置自定义的对话框UI setPositiveButton():设置确认yes按钮 setNegativeButton():设置no按钮看示例:ViewsDemo项目:
18、com.great.views.DialogDemo1.java,对话框Dialog方法,重要方法如下: Show() dismiss() 释放对话框 Hide() Cancel() 等同于dismiss,只是会触发OnCancelListener事件 setCancelMessage() setCancelable(boolean) setCanceledOnTouchOutside,带View的对话框,1、得到布局产生器LayoutInflater Inflater = LayoutInflater.from(ctx); 2、给布局产生器一个布局定义即layout的XML文件,产生一个相应
19、布局的view View dialogView = inflater.inflater(R.layout.dialog,NULL) 3、创建对话框,并给对话框设置view AlertDialog.Builder(ctx).setView(dialogView);,带进度条的对话框,ProgressDialog setProgressType setIndeterminate setCancelable,是否可以取消 setButton看示例:ViewsDemo项目: com.great.views.ProgressBar_Demo1.java com.great.views.ProgressB
20、ar_Demo2.java,切换卡TabWidget,使用TabActivity,通过getTabHost()获取TabHost对象 往TabHost内添加Tab,该Tab由TabHost对象newTabSpec构造TabHost.TabSpec 要想监听各个Tab切换,需要实现OnTabChangedListener接口 各个Tab使用同一块屏幕,使用FrameLayout,各个Tab的view可以相互覆盖看示例:LayoutDemo项目: com.great.layouts.TabWidget_Demo1.java,TabHost.TabSpec,即每个tab,由TabSpec、Indic
21、ator、content构成 TabSpec newTabSpec(String tag) Indicator setIndicator(charsequence label) setIndicator(charsequence label,Drawable icon) setIndicator(View) content setContent(int viewId) setContent(TabHost.TabContentFactory factory) 即实现public View createTabContent(String tag) 接口,返回一个内容View setContent
22、(Intent intent),不使用TabActivity,在不使用TabActivity,使用布局文件来完成 布局文件如下:,不使用TabActivity,JAVA代码,TabHost tabHost = (TabHost) findViewById(R.id.tabhost); / 如果没有继承TabActivity时,通过该种方法加载启动tabHost tabHost.setup(); tabHost.addTab(tabHost.newTabSpec(“tab1“).setIndicator(“第一个标签“, getResources().getDrawable(R.drawable
23、.icon).setContent( R.id.view1); tabHost.addTab(tabHost.newTabSpec(“tab3“).setIndicator(“第三个标签“) .setContent(R.id.view3); tabHost.addTab(tabHost.newTabSpec(“tab2“).setIndicator(“第二个标签“) .setContent(R.id.view2); 看示例:LayoutDemo项目: com.great.layouts.TabWidget_Demo2.java,选项菜单OptionMenu,Res下menu/menudemo1
24、.xml,activity.java中代码,看示例:ViewsDemo项目:com.great.views.MenuDemo1.javacom.great.views.MenuDemo2.java,上下文菜单ContextMenu,在View中注册了ContextMenu后,执行一个在该对象上长按(2秒)的动作,将出现一个具有相关功能的浮动菜单 1、注册菜单:registerForContextMenu(View) 2、呼出菜单时调用onCreateContextMenu(可重写该方法) 3、菜单被选择时调用onContextItemSelected(MenuItem) (可重写该方法)看示例
25、:ViewsDemo项目:com.great.views.ContextMenu_Demo1.java,窗口主题Theme 使用系统主题,1、在 android 的 sdk 安装目录 dataresvaluesthemes.xml 里系统定义好的主题,可以直接使用,在 AndroidManifest.xml 中定义 2、如果整个工程用一个主题就在 application 标签中定义,如下:3、如果在单个activety中用不同主题看示例:ViewsDemo项目:com.great.views.Theme_Demo1.java,31,窗口主题Theme 使用自定义主题,1、先在 res/valu
26、es/styles.xml 文件中定义自已的 Theme,如下:dimen/px50color/BLUE2、在 AndroidManifest.xml 文件中引用自定的 Theme,如下: 可以定义在 application 中,对整个工程起作用可以定义在具体某个 activity 中,只对 activity 起作用看示例:ViewsDemo项目:com.great.views.Theme_Demo2.java,32,style样式使用 系统样式,引用系统的样式:直接在布局文件中配置样式,如下:看示例:ViewsDemo项目: com.great.views.Style_Demo1.java,
27、style样式使用 自定义样式,引用自定义的样式 先在 res/values/styles.xml 文件中定义自定义的样式,如下:dimen/px30 color/RED然后在布局文件中引用自定义的样式看示例:ViewsDemo项目:com.great.views.Style_Demo1.java,其他控件,卷轴视图 ScrollView /网格视图 GridView 图片切换 ImageSwitcher 图片按钮 ImageButton 状态开关按钮 ToggleButton 画廊 Gallery 评级控件 RatingBar 通知 NotificationManager/Notification,