首页计算机计算机软件Android开发工程师教程 05 第五章 菜单和对话框.pptx

05 第五章 菜单和对话框.pptx

页数:40页文件大小:1.79 MB来源: Android开发工程师教程ppt课件

本课件讲解菜单与对话框开发,先介绍选项菜单、子菜单与快捷菜单的创建与事件处理,再说明用XML生成菜单的步骤,最后给出提示、列表、自定义、日期时间与进度条等对话框的完整实现代码。

Android开发工程师教程第五章封面页,标示本篇主题为Android菜单与对话框开发
第五章目录页,标示当前所处部分为选项菜单
选项菜单说明页,介绍android.view.Menu接口管理菜单项及其常用方法见原课件表5-1
查看本课件的文字版(共 40 页,供检索与复制)

第1页:第五章菜单和对话框封面

Android开发工程师教程第五章菜单和对话框开发基础篇

第2页:选项菜单章节目录

本章目录

  • 选项菜单
  • 子菜单
  • 快捷菜单
  • 使用XML生成菜单
  • 提示对话框
  • 日期/时间选择对话框
  • 进度条对话框
  • 本章小结
  • 项目实训

第3页:选项菜单介绍

选项菜单

Android系统的菜单支持主要通过android.view.Menu接口来体现的,Android系统用它来管理各种菜单项。Menu接口中常用的方法见表5-1。

第4页:选项菜单实现代码

选项菜单

选项菜单,实现代码如下:

final static int M1=Menu.FIRST;final static int M2=Menu.FIRST+1;public boolean onCreateOptionsMenu(Menu menu){menu.add(0, M1, 0, "向左");menu.add(0, M2, 0, "向右");return true;}可以用一个MenuItem引用变量来接收一个item项,代码如下:MenuItem item1=menu.add(0, M1, 0, "向左");item1.setIcon(R.drawable.left);item1.setShortcut('1', 'f');

获得MenuItem对象后,就可以调用setIcon()方法设置选项菜单的图标,图标要预先保存在res/drawable目录中。也可以调用setShortcut()方法为菜单项设置快捷键,该方法的第一个参数是数字快捷键,第二个参数是全键盘快捷键。

第5页:菜单项选择处理

选项菜单

如果希望选择菜单某个选项时,执行相应动作,需要覆写onOptionsItemSelected (MenuItem item)方法,方法的参数为用户所选择的那个菜单项,代码如下:

public boolean onOptionsItemSelected(MenuItem item){switch(item.getItemId()){case M1:tvmsg.setText("向左");return true;case M2:tvmsg.setText("向右");return true;}return false;}

第6页:子菜单章节目录

本章目录

  • 子菜单
  • 选项菜单
  • 快捷菜单
  • 使用XML生成菜单
  • 提示对话框
  • 日期/时间选择对话框
  • 进度条对话框
  • 本章小结
  • 项目实训

第7页:子菜单介绍

子菜单

Android系统提供的子菜单(SubMenu)用于更加详细地显示信息,选择子菜单将弹出悬浮窗口显示子菜单项。但是Android系统中的子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。子菜单(SubMenu)继承于Menu,常用的方法见表5-2。

第8页:子菜单实现代码

子菜单

和选项菜单一样,子菜单也是通过重载onCreateOptionsMenu()方法创建,不同的是子菜单需要调用menu.addSubMenu()方法,而不是menu.add()方法,具体代码如下:SubMenu sbmenu=menu.addSubMenu(0, MENU_area, 1, "选择地区");sbmenu.setIcon(R.drawable.area);sbmenu.setHeaderTitle("选择居住的城市");sbmenu.setHeaderIcon(R.drawable.area);sbmenu.add(0,MENU_area +1,0,"北京");sbmenu.add(0,MENU_area +2,1,"上海");

第9页:快捷菜单章节目录

本章目录

  • 快捷菜单
  • 选项菜单
  • 子菜单
  • 使用XML生成菜单
  • 提示对话框
  • 日期/时间选择对话框
  • 进度条对话框
  • 本章小结
  • 项目实训

第10页:快捷菜单介绍

快捷菜单

快捷菜单又称为上下文菜单,与Windows操作系统中的快捷菜单一样都是与某个组件相关的菜单,只是弹出的方式不一样,Windows操作系统中的快捷菜单是右击弹出,而Android系统中的快捷菜单是在某个组件(视图)上长按(超过2秒)后弹出。快捷菜单(ContextMenu)继承于Menu,常用的方法见表5-3。

第11页:创建快捷菜单

快捷菜单

创建快捷菜单,需要覆写onCreateContextMenu()方法,在该方法中创建菜单项,以及设置菜单项的相关属性。当需要处理菜单项的单击事件时,需要覆写onContextItemSelected()方法,每次使用快捷菜单都会调用onCreateContextMenu()方法,创建快捷菜单的关键代码如下:

final static int M1=Menu.FIRST;final static int M2=Menu.FIRST+1;final static int M3=Menu.FIRST+2;@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfomenuInfo){super.onCreateContextMenu(menu, v, menuInfo);menu.setHeaderTitle("请选择某门课程");menu.add(0, M1, 0, "软件工程");menu.add(0, M2, 1, "android软件开发");menu.add(0, M3, 1, "C#程序设计");}

第12页:快捷菜单单击处理

快捷菜单

快捷菜单的单击事件处理:

处理菜单的单击事件需要覆写onContextItemSelected(MenuItem item)方法,当菜单项被选中时,自动调用该方法,方法中的参数就是被选中的菜单项。实现代码如下:

public boolean onContextItemSelected(MenuItem item){switch(item.getItemId()){case M1:tvmsg.setText("软件工程");return true;case M2:tvmsg.setText("android软件开发");return true;case M3:tvmsg.setText("C#程序设计");return true;}return false;}

第13页:快捷菜单注册到View

快捷菜单

快捷菜单是与某个组件相关的菜单,所以创建好快捷菜单后还需要将其和某个组件关联起来,也就是需要调用registerForContextMenu(View view)方法,将快捷菜单注册到View上,实现View组件与快捷菜单的关联。

实例代码如下:

public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);tvmsg=(TextView)findViewById(R.id.tvmsg);this.registerForContextMenu(tvmsg);}

第14页:XML菜单章节目录

本章目录

  • 使用XML生成菜单
  • 选项菜单
  • 快捷菜单
  • 子菜单
  • 提示对话框
  • 日期/时间选择对话框
  • 进度条对话框
  • 本章小结
  • 项目实训

第15页:XML创建菜单步骤

使用XML生成菜单

使用XML文件创建菜单的步骤如下。

  • (1)在项目的res目录下创建menu文件夹,并在menu目录下使用与menu相关的元素定义XML文件。在XML文件中,有3个有效的元素:menu、group和item。item和group必须是menu的子节点元素,且item必须是group的子节点元素。但是在创建子菜单时,menu可作为item的子节点元素。group常用属性见表5-4,item常用属性见表5-5。
  • (2)使用XML文件的资源ID,将XML文件中定义的菜单项添加到menu对象中。
  • (3)响应菜单项时,使用每个菜单项对应的资源ID。

第16页:定义菜单资源文件

使用XML生成菜单

使用XML生成菜单具体实现:

  • (1)定义菜单资源文件。在res目录中创建menu文件夹,并在menu中创建一个XML资源文件,本案例XML资源文件的文件名为menu.xml,详细代码如下:

    <menu xmlns:android="http://schemas.android.com/apk/res/android" ><group android:id="@+id/group1"><item android:id="@+id/m1"android:title="选项1"/><item android:id="@+id/m2"android:title="选项2"/>"</group><group android:id="@+id/group2"><item android:id="@+id/m3"android:title="选项3"/><item android:id="@+id/m4"android:title="选项4"/></group></menu>

以上代码使用

<item>节点定义了4个菜单项,并且使用<group>节点将4个菜单项分为两组。

第17页:MenuInflater添加菜单项

使用XML生成菜单

  • (2)使用MenuInflater添加菜单项。MenuInflater在Android中建立了从资源文件到对象的桥梁,MenuInflater对象通过Activity的getMenuInflater()方法得到,通过调用inflate(intmenuRes,Menumenu)方法把菜单资源文件转换为对象并添加到menu对象中。代码如下:

    public boolean onCreateOptionsMenu(Menu menu){MenuInflater inflater=getMenuInflater();inflater.inflate(R.menu.menu, menu);return true;}

inflate(int menuRes,Menumenu)方法的第一个参数表示待转换的菜单资源文件,第二个参数表示菜单对象。

  • (3)响应菜单项。如果希望选择菜单某个选项时,执行相应动作,同样需要覆写onOptionsItemSelected(MenuItem item)方法

第18页:提示对话框章节目录

本章目录

  • 提示对话框
  • 选项菜单
  • 快捷菜单
  • 使用XML生成菜单
  • 子菜单
  • 日期/时间选择对话框
  • 进度条对话框
  • 本章小结
  • 项目实训

第19页:对话框类型介绍

提示对话框

在Android开发中,经常需要在Android应用程序界面上弹出对话框,以节省界面空间。Dialog的直接子类有AlertDialog(提示对话框)、CharacterPickerDialog(字符选择对话框);间接子类有DatePickDialog(日期选择对话框)、ProgressDialog(进度对话框)、TimePickerDialog(时间选择对话框)。

AlertDialog的功能比较强大,可以生成4种预定义对话框:

  • (1)带消息和多个按钮的提示对话框。
  • (2)带列表和多个按钮的列表对话框。
  • (3)带多个单选列表项和多个按钮的对话框。
  • (4)带多个复选列表项和多个按钮的对话框。

第20页:AlertDialog.Builder

提示对话框

AlertDialog类的构造方法全部都是protected的,所以不能直接通过AlertDialog类创建一个AlertDialog对象,但是可以通过其内部类AlterDialog.Builder来创建,AlertDialog.Builder的常用方法见表5-6。

第21页:带消息和按钮对话框

提示对话框

1.带消息和按钮的提示对话框此类对话框不需要界面布局,实现比较简单,具体实现代码如下:

protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);AlertDialog.Builder alertDialog = newAlertDialog.Builder(this);//设置标题alertDialog.setTitle("请认真选择");//设置提示信息alertDialog.setMessage("你喜欢智能手机开发这门课吗?");//设置图标alertDialog.setIcon(R.drawable.ic_launcher);//添加PositiveButtonalertDialog.setPositiveButton("非常喜欢",newDialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, intwhich){//设置选择PositivieButton时所执行的操作}});//添加NegativeButtonalertDialog.setNegativeButton("不喜欢",newDialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){//设置选择NegativeButton时所执行的操作}});//添加NeutralButtonalertDialog.setNeutralButton("一般般",newDialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){//设置选择NeutralButton时所执行的操作}});//创建对话框Dialog dialog = alertDialog.create();//显示对话框dialog.show();}

第22页:带列表和按钮对话框

提示对话框

2.带列表和按钮的列表对话框

  • 此类列表对话框也不需要界面布局,但与带消息和按钮的提示对话框不同的是,实现时需要先定义在列表对话框中显示的内容,下述代码中定义了一个字符串数组course[],用于存放一组课程名;然后调用setItems(CharSequence[]items,DialogInterface.OnClickListenerlistener)方法,实现显示列表项,该方法的第一个参数就是对应的列表项字符串数组;第二个参数是对选项的监听事件。运行效果如图5.7所示,详细代码如下:

    public class MainActivity extends Activity {private String course[]=new String[]{"语文","数学","英语","化学","物理"};//定义需要显示的列表内容@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);AlertDialog.Builder alertDialog=newAlertDialog.Builder(this);alertDialog.setTitle("你喜欢哪门功课?");//设置标题alertDialog.setIcon(R.drawable.ic_launcher);//设置图标//设置列表项对话框alertDialog. setItems(course,newDialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){Toast.makeText(MainActivity.this,course[which],Toast.LENGTH_SHORT).show();}});//设置PositivieButtonalertDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterfacedialog, int which){//设置选择PositivieButton时所执行的操作}});//设置NegativeButtonalertDialog.setNegativeButton("取消", newDialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterfacedialog,int which){//设置选择NegativeButton时所执行的操作}});Dialog dialog= alertDialog.create();//创建对话框dialog.show(); 

    第23页:单选列表对话框

    提示对话框

    3.带单选列表项和按钮的单选列表对话框

    • 此类对话框的实现只需要将列表对话框中的setItems(CharSequence[]items,DialogInterface.OnClickListenerlistener)方法修改为setSingleChoiceItems(CharSequence[]items, int checkedItem,DialogInterface.OnClickListenerlistener)方法,该方法中的第一个参数表示对应列表项字符串数组;第二个参数表示默认选中的item项的ID;第三个参数表示选中选项的监听事件。程序运行效果如图5.8所示。

    第24页:复选列表对话框

    提示对话框

    4.带复选列表项和按钮的复选列表对话框

    • 此类对话框的实现,只需要将单选列表对话框中的setSingleChoiceItems(CharSequence[]items, intcheckedItem,DialogInterface.OnClickListenerlistener)方法修改为setMultiChoiceItems(CharSequence[]items, boolean[]checkedItems,DialogInterface.OnMultiChoice ClickListenerlistener)方法,setMultiChoiceItems()方法中第一个参数是对应列表项的字符串数组;第二个参数是一个布尔型的数组,用于表示复选框是否选中;图5.9所示效果中默认的是选中“语文”和“物理”复选框,所以定义的布尔型数组为:privateboolean[] courseSelected=newboolean[]{true,false,false,false, true};第三个参数表示选中选项的监听事件。

    第25页:自定义对话框布局

    提示对话框

    5.自定义对话框

    • (1)自定义对话框的界面布局,本案例中用到了TextView组件和EditText组件。布局文件login.xml代码如下

      <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/user" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/password" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1" /></LinearLayout></LinearLayout>

    第26页:自定义对话框代码

    提示对话框

    • (2).详细代码如下:

      public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//取得自定义viewLayoutInflater layoutInflater = LayoutInflater.from(this);View loginView = layoutInflater.inflate(R.layout.login, null);AlertDialog.Builder alertDialog = newAlertDialog.Builder(this);alertDialog.setTitle("用户登录");alertDialog.setIcon(R.drawable.ic_launcher);//为对话框设置视图alertDialog.setView(loginView);alertDialog.setPositiveButton("登录",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, intwhich){}});alertDialog.setNegativeButton("取消",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, intwhich){}});alertDialog.create();alertDialog.show();}}

    第27页:日期时间对话框目录

    本章目录

    • 日期/时间选择对话框
    • 选项菜单
    • 快捷菜单
    • 使用XML生成菜单
    • 提示对话框
    • 子菜单
    • 进度条对话框
    • 本章小结
    • 项目实训

    第28页:日期时间对话框介绍

    日期/时间选择对话框

    Android系统开发中提供了DatePickerDialog组件和TimePickerDialog组件,分别用于选择日期和时间。它们与DatePicker和TimePicker不同的是以弹出式对话框形式显示在界面上。

    1.界面设计

    • 界面中用两个TextView组件分别显示日期和时间,用两个Button组件分别用于单击后弹出日期对话框和时间对话框,用户在日期和时间对话框中修改日期和时间后,将新的日期和时间信息显示在TextView组件上。

    第29页:创建对话框代码

    日期/时间选择对话框

    2.创建对话框

    • 创建对话框部分,对两个按钮实现单击事件监听,分别调用showDateDialog()方法和showTimeDialog()方法来创建日期对话框和时间对话框。在showDateDialog()方法中调用了DatePickerDialog类的构造方法DatePickerDialog(Contextcontext,DatePickerDialog.OnDateSetListenercallBack, int year, int monthOfYear, int dayOfMonth)来创建对话框,方法中第一个参数表示创建DatePickerDialog的Activity;第二个参数表示监听日期发生改变的监听器;第三个参数表示年份;第四个参数表示月份;最后一个参数表示月份中哪一天。在showTimeDialog()方法中调用了TimePickerDialog类的构造方法TimePickerDialog(Contextcontext,TimePickerDialog.OnTimeSetListenercallBack, inthourOfDay, int minute, boolean is24HourView),方法中第一个参数表示创建TimePickerDialog的Activity;第二个参数表示监听时间发生改变的监听器;第三个参数表示小时;第四个参数表示分钟;最后一个参数表示是否是24小时制。需要注意的是,在创建日期对话框和时间对话框时分别需要实现OnDateSetListener和OnTimeSetListener接口。

    第30页:显示日期对话框

    日期/时间选择对话框

    //显示日期对话框

    protected void showDateDialog(){OnDateSetListener Datelistener = new OnDateSetListener(){@Overridepublic void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth){//根据对话框上年、月、日的调整,设置日历的年、月、日cal.set(year, monthOfYear, dayOfMonth);//创建日期格式器对象SimpleDateFormat SDformat = new SimpleDateFormat("yyyy-MM-dd");//将当前日期按照格式显示在TextView上tvDate.setText(SDformat.format(cal.getTime()));}};//根据Calendar对象获取到的当前年、月、日创建对话框DatePickerDialog Datedialog = new DatePickerDialog(MainActivity.this,Datelistener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH));//调用show()方法显示对话框Datedialog.show();}

    第31页:显示时间对话框

    日期/时间选择对话框

    //显示时间对话框

    protected void showTimeDialog(){OnTimeSetListener TimeListener = new OnTimeSetListener(){@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute){//根据时间对话框的调整,设置日历对象的时、分cal.set(Calendar.HOUR, hourOfDay);cal.set(Calendar.MINUTE, minute);tvTime.setText(hourOfDay + ":" + minute);}};//根据Calendar对象获取到的当前时、分创建对话框,true表示按照24小时制来显示时间TimePickerDialog TimeDialog = new TimePickerDialog(MainActivity.this,TimeListener, cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE),true);//调用show()方法显示对话框TimeDialog.show();}}

    第32页:进度条对话框目录

    本章目录

    • 进度条对话框
    • 选项菜单
    • 快捷菜单
    • 使用XML生成菜单
    • 提示对话框
    • 日期/时间选择对话框
    • 子菜单
    • 本章小结
    • 项目实训

    第33页:ProgressDialog介绍

    进度条对话框

    ProgressDialog(进度条对话框)和ProgressBar(进度条)有着异曲同工之处,都是用于显示程序的执行进度,不同的是ProgressDialog以对话框的形式展示出来。ProgressDialog对话框也可以通过相应方法设置对话框上显示的文字、图标、进度条的样式,当然也需要使用线程来控制进度条的显示。ProgressDialog常用方法见表5-7

    第34页:创建进度条对话框

    进度条对话框

    创建进度条对话框

    • 通过调用setProgressStyle(ProgressDialog. STYLE_SPINNER)方法设置为圆形进度条,调用setProgressStyle(ProgressDialog.STYLE_ HORIZONTAL)方法设置为长形的进度条。然后使用表5-7中提供的方法设置进度条的相关属性。在使用setButton()方法为对话框设置按钮时,必须设置按钮的文本和按钮单击的监听事件,最后使用线程更新进度;另外setIndeterminate(boolean indeterminate)方法的参数要为false,否则不可以显示进度条的进度,而是循环在进度条最小值和最大值之间移动,默认的值为true。

    第35页:进度条对话框代码

    进度条对话框

    具体实现代码如下:

    protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//获取按钮对象btnRectangle = (Button)findViewById(R.id.btnRectangle);//创建长形进度条对话框btnRectangle.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){count = 0;pgDialog = new ProgressDialog(MainActivity.this);//设置长形风格的进度pgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条标题pgDialog.setTitle("提示");//设置进度条图标pgDialog.setIcon(R.drawable.ic_launcher);//设置进度条提示信息pgDialog.setMessage("这是一个长形进度条对话框");//设置进度条为不明确才可以在进度条上显示具体进度pgDialog.setIndeterminate(false);//设置当前进度值pgDialog.setProgress(0);//设置第二进度条的值pgDialog.setSecondaryProgress(0);//设置进度条最大值pgDialog.setMax(1000);//设置按Backspace键取消进度条pgDialog.setCancelable(true);//添加ButtonpgDialog.setButton("取消", newCancelBtnListener());//显示对话框pgDialog.show();//创建线程更新进度new Thread(){public void run(){try {while (count <=pgDialog.getMax()){pgDialog.setProgress(count++);//暂停0.2秒Thread.sleep(200);}//取消对话框pgDialog.cancel();} catch (Exception e){//取消对话框pgDialog.cancel();}}}.start();}});}//“取消”按钮的监听器class CancelBtnListener implementsDialogInterface.OnClickListener {public void onClick(DialogInterface dialog, intwhich){dialog.cancel();}}}

    第36页:小结章节目录

    本章目录

    • 本章小结
    • 选项菜单
    • 快捷菜单
    • 使用XML生成菜单
    • 提示对话框
    • 日期/时间选择对话框
    • 进度条对话框
    • 子菜单
    • 项目实训

    第37页:本章小结

    本章小结

    本章主要介绍了选项菜单(Options Menu)、子菜单(SubMenu)和快捷菜单(ContextMenu)的常用属性和使用方法,以及如何通过XML文件创建菜单。同时介绍了功能强大的AlertDialog(提示对话框)、DatePickerDialog(日期选择对话框)、TimePickerDialog(时间选择对话框)以及不同风格的ProgressDialog的使用。读者通过本章的学习,可以设计出更好的用户界面,为Android应用程序提供更完备的功能。

    第38页:实训章节目录

    本章目录

    • 项目实训
    • 选项菜单
    • 快捷菜单
    • 使用XML生成菜单
    • 提示对话框
    • 日期/时间选择对话框
    • 进度条对话框
    • 本章小结
    • 子菜单

    第39页:项目实训

    项目实训

    项目一

    项目名:用XML文件自定义菜单。

    功能描述:实现的菜单效果如图5.15所示。

    项目二

    项目名:自定义“退出”对话框。

    功能描述:实现的效果图如图5.16所示。

    第40页:第五章结束致谢页

    The end,thank you!