第7讲用户界面(4)——菜单和对话框一、对话框AlertDialog教材P49例子:按下程序退出键,弹出是否退出对话框方法一、匿名内部类写对话框确定按钮的事件响应publicclassMainActivityextendsActionBarActivity{@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){//监听键盘事件if(keyCode==KeyEvent.KEYCODE_BACK){//判断按下的是否退出键//弹出询问是否退出的对话框AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setIcon(R.drawable.ic_launcher);builder.setTitle(系统提示);builder.setMessage(确定要退出么?);builder.setPositiveButton(确定,newOnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//关闭ActivityMainActivity.this.finish();}});builder.setNegativeButton(取消,null);builder.show();}returnsuper.onKeyDown(keyCode,event);}方法二、实例化一个内部类,作为事件监听器类注意:对话框的事件监听器类是:DialogInterface.OnClickListener,需要importandroid.content.DialogInterface.OnClickListener;而不是importandroid.view.View.OnClickListener;publicclassMainActivityextendsActionBarActivity{@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){//监听键盘事件if(keyCode==KeyEvent.KEYCODE_BACK){//判断按下的是否退出键//弹出询问是否退出的对话框AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setIcon(R.drawable.ic_launcher);builder.setTitle(系统提示);builder.setMessage(确定要退出么?);builder.setPositiveButton(确定,listener);builder.setNegativeButton(取消,listener);builder.show();}returnsuper.onKeyDown(keyCode,event);}DialogInterface.OnClickListenerlistener=newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//注意和按钮事件的OnClickListener区别switch(which){caseAlertDialog.BUTTON_POSITIVE://按下的是确定按钮MainActivity.this.finish();break;caseAlertDialog.BUTTON_NEGATIVE:break;default:break;}}};二、菜单一个菜单包含多个菜单项和子菜单,子菜单其实也是菜单,因为它实现了Menu接口,因此子菜单也可以包含多个菜单项菜单分三类:(1)选项菜单步骤1、定义选项菜单的布局文件Res/menu/main.xml步骤2、将菜单显示在Activity上@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;}步骤3、设置菜单的事件响应@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//Handleactionbaritemclickshere.Theactionbarwill//automaticallyhandleclicksontheHome/Upbutton,solong//asyouspecifyaparentactivityinAndroidManifest.xml.intid=item.getItemId();switch(id){caseR.id.exit:MainActivity.this.finish();break;caseR.id.menuItem_red:tv_hello.setTextColor(Color.RED);break;caseR.id.menuItem_blue:tv_hello.setTextColor(Color.BLUE);break;}returnsuper.onOptionsItemSelected(item);}(2)上下文菜单步骤1、设置上下文菜单,覆盖Activity的onCreateContextMenu方法publicclassMainActivityextendsActivity{privatefinalintCONTEXT_MENU_RED=Menu.FIRST;privatefinalintCONTEXT_MENU_GREEN=Menu.FIRST+1;privatefinalintCONTEXT_MENU_BLUE=Menu.FIRST+2;//创建上下文菜单@OverridepublicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo){//TODOAuto-generatedmethodstubmenu.add(0,CONTEXT_MENU_BLUE,0,蓝色);menu.add(0,CONTEXT_MENU_GREEN,0,绿色);menu.add(0,CONTEXT_MENU_RED,0,红色);//super.onCreateContextMenu(menu,v,menuInfo);}步骤2、将上下文菜单注册到组件上protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_hello=(TextView)this.findViewById(R.id.tv_hello);layout=(RelativeLayout)this.findViewById(R.id.layout);//将上下文菜单加到layout上this.registerForContextMenu(layout);}步骤3、编写上下文菜单的事件响应,覆盖Activity的onContextItemSelected方法//上下文菜单的事件响应@OverridepublicbooleanonContextItemSelected(MenuItemitem){//TODOAuto-generatedmethodstubswitch(item.getItemId()){caseCONTEXT_MENU_RED:layout.setBackgroundColor(Color.RED);break;caseCONTEXT_MENU_BLUE:layout.setBackgroundColor(Color.BLUE);break;caseCONTEXT_MENU_GREEN:layout.setBackgroundColor(Color.GREEN);break;}returnsuper.onContextItemSelected(item);}(3)OverflowMenu:没有物理menu键的手机,可以通过ActionBar的overflow按钮,来代替menu键。ActionBar:操作栏,替代了以前的标题栏(1)程序的图标(2)选项菜单的图标按钮(3)overflow按钮,里面存放了不常用的选项菜单如何定义ActionBar右边的菜单项(和选项菜单类似)步骤1、定义一个描述菜单的xml文件注意:android:showAsAction属性never:不会放在ActionBar,只会出现在底部菜单,使用物理的Menu键调出ifRoom:如果菜单项有图标和文字,如果有空间,就会将图标直接显示在ActionBar上always:一直显示在ActionBar上withText:只显示文字,折叠进overflow按钮中,通过按下右边的三点,弹出菜单项。menuxmlns:android=:tools=:context=com.example.menudialogdemo1_7.MainActivityitemandroid:icon=@drawable/ic_launcherandroid:id=@+id/action_settingsandroid:orderInCategory=100android:showAsAction=alwaysandroid:title=界面设置menuitemandroid:id=@+id/menuItem_redandroid:title=红色/itemandroid:id=@+id/menuItem_blueandroid:title=蓝色//menu/itemitemandroid:icon=@drawable/ic_launcherandroid:id=@+id/exitandroid:title=退出程序android:showAsAction=withText/itemandroid:icon=@drawable/ic_launcherandroid:title=aaaandroid:showAsAction=always/itemandroid:icon=@drawable/ic_launcherandroid:title=bbbandroid:showAsAction=withText//menu步骤2、将xml文件通过onCreateOptionsMenu设置到Activity上去(和原始的选项菜单的做法一样的)@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.MenuInflaterinflater=getMenuInflater();inflater.inflate(R.menu.main,menu);returntrue;}步骤3、事件响应(和原始的选项菜单的做法一样的)onOptionsItemSelected步骤4、强制显示overflow按钮在Activity中定义方法,然后在Activity中去调用这个方法//强制显示overflow的三点privatevo