基于安卓平台的程序设计:Android用户界面4_第1页
基于安卓平台的程序设计:Android用户界面4_第2页
基于安卓平台的程序设计:Android用户界面4_第3页
基于安卓平台的程序设计:Android用户界面4_第4页
基于安卓平台的程序设计:Android用户界面4_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android用户界面(4)7.11 ListView控件 ListView是内部数据和界面分开的。内部数据和表项用不同方式指定 用适配器指定ListView的内容和表项的显示方式。 用 setAdapter成员函数指定适配器 设置项目选中的监听器: listView.setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) /arg0 就是 ListView,arg1是选中的那项 /

2、arg2是项的序号( 从0开始算) arg3是项的 id /arg1是被选中的那项(可以是个ViewGroup) ); 修改表项内容的办法和 Spinner类似,只要修改数据源,然后调用适配器的 notifyDataSetChanged 成员函数即可。 7.11.1 简单 ListView控件 List data = new ArrayList(); 用这样的data就可以作为 ListView中的数据来源 可以用 ArrayAdapter adapter 这样的 adapter 对象作 为ListView的适配器 ArrayAdapter adapter = new ArrayAdapter

3、(this, android.R.layout.simple_list_item_1, data ); android.R.layout.simple_list_item_1 是表项的类型 (P97) 表项可以是 TextView,CheckBox,RadioButton等。7.11.1 简单 ListView控件演示程序:ListViewDemoActivity:main.xml public class ListViewDemoActivity extends Activity ListView listView;TextView txtResult; Override public vo

4、id onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); List data = new ArrayList(); for( int i = 0;i 20; + i) data.add(测试数据1 + Integer.toString(i); listView = (ListView) findViewById(R.id.lvBook); txtResult = (TextView) findViewById(R.id.txtResult);

5、 ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data ); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) /arg0 就是 ListView,arg1是选中的那项 /arg2

6、是项的序号( 从0开始算) arg3是项的 id txtResult.setText(第+ Integer.toString(arg2)+“项: + (TextView)arg1).getText().toString() + : + Long.toString(arg3); ); 7.11.2 自定义表项的 ListView控件ListView的每个表项,可以是个ViewGroup,里面可以包含多个不同类型的控件。例子程序:ListViewDemo2Activity可以在一个专门的 xml文档里定义表项的形式。一个表项就可以是一个布局。例如下面的 row.xml,包含两个TextView和一

7、个CheckBox, 可以让ListView的每个表项都是这个样子: 使用自定义表项,需要用到 SimpleAdaptersimpleAdapter的构造函数 如下: SimpleAdapter(Context context, List ? extends Map data, int resource,String from, int to) 一个SimlpleAdapter是这样工作的:假设将SimpleAdapter用于ListView。那么ListView的每一个列表项就是resource参数值指定的布局。而data参数就是要加载到ListView中的数据。我们先看每一个列表项,假设列

8、表项所对应的布局文件中包含了三个组件:TextView、TextView和 EditText,id分别为id_ve1,id_ve2,id_ve3那么在加载列表项时,需要通过组件的id和data参数中List元素中的Map对象对应。因此,from参数对应于Map对象的key,而to表示组件的id,例如,本例中的参数值为from = new String姓名, 性别,年龄,to = new int R.id.ve_id1,R.id.ve_id2,R.id.ve_id3。意思就是将Map对象中key为姓名”的value绑定到R.id.ve_id1,意思就是将Map对象中key为性别”的value绑定

9、到R.id.ve_id2,意思就是将Map对象中key为年龄”的value绑定到R.id.ve_id3,现在来看data参数,一个ListView由多个列表项组成。每一个列表项由一个Map对象提供数据,而多个列表项则由List对象提供多个Map对象。下面的程序为一个ListView设定了Adapter: 程序来源:ListViewDemo2Activity ArrayListMap data; data= new ArrayListMap(); Map item; item=new HashMap(); item.put(姓名, 张三小朋友); item.put(性别, 男); item.pu

10、t(婚否, false); item=new HashMap(); item.put(姓名, 小张同学); item.put(性别, 女); item.put(婚否, true); data.add(item); SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.row, new String姓名,性别,婚否, new int R.id.ve_id_1, R.id.ve_id2,R.id.ve_id3); listView.setAdapter(adapter); 7.11.2 复杂的自定义表项 ListView例子程序:

11、ListViewDemo37.11.2 复杂的自定义表项 ListViewrow.xml(对应列表项的xml): listviewdemo3.xml (主界面的xml) 程序: ListViewDemo3 1) 要从BaseAdapter派生出 MyAdapter2) MyAdapter重写 getCount,返回表项总数3) MyAdapter重写getView. 每次一个表项需要被显示的时候,都会调用 getView。4)在getView中对每个表项中的每个控件设置监听器程序: ListViewDemo3 public View getView(int position, View con

12、vertView, ViewGroup parent) / 每个listview的表项被显示时,都会调用本函数。convertView就是待显示的表项 / position 是表项的序号,从0开始 /一个表项的第一次getView时,convertView是null,/此时需要对 convertView进行设置, /然后后面再getview(比如表项由于卷滚而需要重新显示),convertView就不是null了 7.12 ExpandableListView (P101)需要用 BaseExpandableListAdapter对象作为其适配器7.12 ExpandableListView

13、(P101)main.xml:8 菜单菜单是应用程序中非常重要的组成部分,能够在不占用界面空间的前提下,为应用程序提供了统一的功能和设置界面,并为程序开发人员提供了易于使用的编程接口Android系统支持三种菜单选项菜单(Option Menu)子菜单(Submenu)快捷菜单(Context Menu)8 菜单选项菜单选项菜单是一种经常被使用的Android系统菜单打开方式:通过“菜单键”(MENU key)打开选项菜单分类图标菜单(Icon Menu)扩展菜单(Expanded Menu)8 菜单选项菜单图标菜单能够同时显示文字和图标的菜单,最多支持6个子项图标菜单不支持单选框和复选框8

14、菜单选项菜单扩展菜单是在图标菜单子项多余6个时才出现,通过点击图标菜单最后的子项“More”才能打开扩展菜单是垂直的列表型菜单不能够显示图标支持单选框和复选框8 菜单选项菜单重载Activity的onCreateOptionMenu()函数,才能够在Android应用程序中使用选项菜单初次使用选项菜单时,会调用onCreateOptionMenu()函数,用来初始化菜单子项的相关内容设置菜单子项自身的子项的ID和组ID菜单子项显示的文字和图片等例子程序:MenuTest (P133)8 菜单重载Activity的onCreateOptionMenu()函数,才能够在Android应用程序中使用

15、选项菜单Override public boolean onCreateOptionsMenu(Menu menu)menu.add(0, PLAIN_ITEM1, 0, 普通菜单项1);menu.add(0, PLAIN_ITEM2, 1, 普通菜单项2); SubMenu fontMenu = menu.addSubMenu(字体大小); fontMenu.add(0, FONT_10, 2, 10号字体); fontMenu.add(0, FONT_12, 3, 12号字体); return true; 用 menu.add来添加一个菜单项 menu.addSubMenu添加子菜单PLA

16、IN_ITEM1 ,FONT_10等是自定义的int类型的菜单ID,可以用Menu.FIRST + n8 菜单选项菜单添加菜单子项的图标和快捷键:使用setIcon()函数和setShortcut()函数MENU_DOWNLOAD菜单设置图标和快捷键的代码第2行代码中使用了新的图像资源,用户将需要使用的图像文件拷贝到/res/drawable目录下setShortcut()函数第一个参数是为数字键盘设定的快捷键第二个参数是为全键盘设定的快捷键,且不区分字母的大小写 menu.add(0,MENU_DOWNLOAD,0,下载设置) .setIcon(R.drawable.download); .

17、setShortcut(,d);8 菜单选项菜单如果要响应菜单项点击事件,则可以重写Activity的onOptionsItemSelected(MenuItem mi) 方法public boolean onOptionsItemSelected(MenuItem mi) switch (mi.getItemId() case FONT_10: /菜单项idbreak;Case FONT_12:break;case FONT_14:break; 也可以用为菜单项指定监听器的方式响应菜单选择(P136)8 菜单选项菜单重载onPrepareOptionsMenu()函数,能够动态的添加、删除菜

18、单子项,或修改菜单的标题、图标和可见性等内容onPrepareOptionsMenu()函数的返回值的含义与onCreateOptionsMenu()函数相同返回true则显示菜单返回false则不显示菜单8 菜单选项菜单下面的代码是在用户每次打开选项菜单时,在菜单子项中显示用户打开该子项的次数 Override /覆盖了 Activity 的onPrepareOptionsMenu方法 public boolean onPrepareOptionsMenu(Menu menu) MenuItem item = menu.findItem(PLAIN_ITEM); item.setTitle(

19、变化选项第 +String.valueOf(showTimes+)+次); return true; 8 菜单子菜单子菜单是能够显示更加详细信息的菜单子项菜单子项使用了浮动窗体的显示形式,能够更好适应小屏幕的显示方式8 菜单子菜单Android系统的子菜单使用非常灵活,可以在选项菜单或快捷菜单中使用子菜单,有利于将相同或相似的菜单子项组织在一起,便于显示和分类子菜单不支持嵌套子菜单的添加是使用addSubMenu()函数实现SubMenu uploadMenu = (SubMenu) menu.addSubMenu(0,MENU_UPLOAD,1,上传设置).setIcon(R.drawabl

20、e.upload);uploadMenu.setHeaderIcon(R.drawable.upload);uploadMenu.setHeaderTitle(上传参数设置);uploadMenu.add(0,SUB_MENU_UPLOAD_A,0,上传参数A);uploadMenu.add(0,SUB_MENU_UPLOAD_B,0,上传参数B);8 菜单子菜单第1行代码在onCreateOptionsMenu()函数传递的menu对象上调用addSubMenu()函数,在选项菜单中添加一个菜单子项,用户点击后可以打开子菜单addSubMenu()函数与选项菜单中使用过的add()函数支持相

21、同的参数,同样可以指定菜单子项的ID、组ID和标题等参数,并且能够通过setIcon()函数菜单所显示的图标第2行代码使用setHeaderIcon ()函数,定义子菜单的图标第3行定义子菜单的标题,若不规定子菜单的标题,子菜单将显示父菜单子项标题,即第1行代码中 “上传设置”第4行和第5行在子菜单中添加了两个菜单子项,菜单子项的更新函数和选择事件处理函数,仍然使用onPrepareOptionsMenu()函数和onOptionsItemSelected ()函数8 菜单子菜单以上小节的代码为基础,将“上传设置”改为子菜单,并在子菜单中添加“上传参数A”和“上传参数B”两个菜单子项。完整代码

22、请参考MySubMenu程序,运行结果如图8 菜单快捷菜单(上下文菜单)快捷菜单同样采用了动窗体的显示方式,与子菜单的实现方式相同,但两种菜单的启动方式却截然不同启动方式:快捷菜单类似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒后,将启动注册到该界面元素的快捷菜单8 菜单快捷菜单(上下文菜单)使用要点1) 用registerForContextMenu(View x) 为需要弹出菜单的控件x设置上下文菜单 。 这样,用户在长时间点击界面控件x时,便会启动快捷菜单2) 重写Activity的public void onCreateContextMenu(ContextMenu me

23、nu, View source, ContextMenu.ContextMenuInfo menuInfo) 方法,上下文菜单每次出现时都会调用它,在这里生成菜单项3) 重写Activity的public boolean onContextItemSelected(MenuItem mi) 方法,响应在上下文菜单上做的选择例子程序 ContextMenuTest (P142)8 菜单快捷菜单选项菜单中的onCreateOptionsMenu()函数仅在选项菜单第一次启动时被调用一次快捷菜单的onCreateContextMenu()函数每次启动时都会被调用一次final static int

24、CONTEXT_MENU_1 = Menu.FIRST;final static int CONTEXT_MENU_2 = Menu.FIRST+1;final static int CONTEXT_MENU_3 = Menu.FIRST+2;Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)menu.setHeaderTitle(快捷菜单标题);menu.add(0, CONTEXT_MENU_1, 0,菜单子项1);menu.add(0, CONTEXT_MEN

25、U_2, 1,菜单子项2);menu.add(0, CONTEXT_MENU_3, 2,菜单子项3);8 菜单 快捷菜单ContextMenu类支持add()函数(代码第7行)和addSubMenu()函数,可以在快捷菜单中添加菜单子项和子菜单第5行代码的onCreateContextMenu()函数中的参数第1个参数menu是需要显示的快捷菜单第2个参数v是用户选择的界面元素第3个参数menuInfo是所选择界面元素的额外信息8 菜单快捷菜单在Android系统中,菜单不仅能够在代码中定义,而且可以像界面布局一样在XML文件中进行定义使用XML文件定义界面菜单,将代码与界面设计分类,有助于简

26、化代码的复杂程度,并且更有利于界面的可视化8 菜单快捷菜单首先需要创建保存菜单内容的XML文件在/src目录下建立子目录menu,并在menu下建立context_menu.xml文件,代码如下在描述菜单的XML文件中,必须以标签(代码第1行)作为根节点,标签(代码第2行)用来描述菜单中的子项,标签可以通过嵌套实现子菜单的功能8 菜单快捷菜单XML菜单的显示结果如图所示8 菜单快捷菜单在XML文件中定义菜单后,在onCreateContextMenu()函数中调用inflater.inflate()方法,将XML资源文件传递给菜单对象第4行代码中的getMenuInflater()为当前的Ac

27、tivity返回MenuInflater第5行代码将XML资源文件R.menu.context_menu,传递给menu这个快捷菜单对象Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.context_menu, menu); 9 对话框例子程序 Examples_04_1410 Notification通知例子程序 Notifica

28、tionTest (P130)11 基于回调的事件处理对于控件X上的事件,可以为其设置事件监听器,处理在其上发生的事件也可以重写X的时间处理方法,用于处理事件。这就是基于回调的事件处理所有UI 控件都有一些时间处理方法,例如:boolean onKeyDown(int keyCode,KeyEvent event);boolean onKeyLongPress(int keyCode,KeyEvent event);Boolean onTouchEvent(MotionEvent event);重写这些方法就能响应对应的事件例子程序CustomView:(P160),自定义控件重写onTouc

29、hEvent11 基于回调的事件处理大多数情况下,使用设置监听器的事件处理方式。回调方式适用于能增强程序内聚性的情况。MotionEvent详解MotionEvent有以下重要方法: getAction(),返回值可以是:MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP MotionEvent.ACTION_MOVEgetX,getY 返回触摸点的坐标getHistorySize 取move过程中的经过的历史数据(点)的个数getHistoricalEventTime(int i); 取第i个历史点的经过时间getHistoricalPressure(i

30、nt i);取经过第i个历史点时的压力getHistoricalX(i) ,getHistoricalY(i) 取第i个历史点的坐标 MotionEvent详解MotionEvent参数中不仅有触摸事件的类型信息,还触点的坐标信息,获取方法是使用getX()和getY()函数,这两个函数获取到的是触点相对于父界面元素的坐标信息。如果需要获取绝对坐标信息,则可使用getRawX()和getRawY()函数触点压力是一个介于0和1之间的浮点数,用来表示用户对触摸屏施加压力的大小,接近0表示压力较小,接近1表示压力较大,获取触摸事件触点压力的方式是调用getPressure()函数触点尺寸指用户接触触摸屏的接触点大小,也是一个介于0和1之间的浮点数,接近0表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论