–第四章:对话框、信息提示和菜单 本文对Android面试宝典的面试题目做一点总结和记录,希望对大家有帮助。
解析:对话框的显示使用的是AlertDialog,它的串模式也是Builder模式! 答案:Android的标准对话框最多可以有三个按钮,AlertDialog.Builder类提供了3个直观的显示按钮的方法:setPositiveButton(左起第1)、setNeutralButton(第2)、setNegativeButton(第3).
答案:AlertDialog.Builder类的方法:setPositiveButton、setNeutralButton、setNegativeButton,可以设置按钮点击事件监听对象,例如,下面的按钮响应了第一个按钮的点击事件:
new AlertDialog.Builder(this) .setTitle(“我的对话框”) .positiveButton(“确定”,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog,int whichButton){ //响应按钮的点击事件的代码 } }).show();解析:本题考查的是AlertDialog.Builder.setItems的使用方法。 答案:使用AlertDialog.Builder.setItems的方法可以将一个String数组以列表的形式显示在对话框中,代码如下:
//定义要显示在列表中的字符串数组 String[] provinces=new String[]{“广东省”,”广西省”,”江西省”,”四川省”}; //对话框对象的创建 new AlertDialog.Buikder(this) .setItems(provinces,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog,int which){ Log.e(“TAG”,”你选择了”+provinces[which]); } }).show();答案:使用AlertBuilder.Builder.setSingleChoiceItems方法可以在对话框上显示列表,也可以在后面添加选项按钮。 示例代码:
// 单选按钮的对话框,选择一个按钮值后, // 对话框也是不会自动消失,需要自己关闭 // 要设置按钮,点击按钮后对话框才会消失 String[] array=new String[]{“音乐”,”体育”,”舞蹈”,”看书”}; final AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置标题 builder.setTitle("选择你最喜欢的课程"). // 设置可选择的内容,并添加点击事件 // 第一个参数是可以选择的单选框的内容 // 第二个参数是默认选中的项 // 第三个参数是点击选中的监听器 setSingleChoiceItems(array, 0, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "选择" + array[which], 0).show(); } }). // 因为对话框不会自动消失,所以要添加按钮的必要 // 设置确定按钮 setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "选择确定", 0).show(); } }). // 取消,什么都不做,对话框消失而已 setNegativeButton("取消", null). // 产生对话框,并显示出来 create().show();答案:使用ALertDialog.Builder.setMultiChoiceItems方法,示例代码:
String[] array=new String[]{“音乐”,”体育”,”舞蹈”,”看书”}; // 多选按钮的默认状态 boolean[] checkedItems = { true, false, false, true }; // 多选按钮选中后保存的数据 final List<String> list = new ArrayList<String>(); // 创建对话框的builder对象 final AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置标题 builder.setTitle("选择你最喜欢的课程"). // 设置可选择的内容,并添加点击事件 // 第一个参数是可以选择的选框的内容 // 第二个参数是一个布尔数组,如果是true代表的是默认选中 // 第三个参数是点击选中的监听器 setMultiChoiceItems(array, checkedItems, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // 这里无论某个选项是被选中后被取消都会触发该方法 // which代表的是选中的是多少游标值的选项 // isChecked是代表该选项是或否选中了 // 判断如果集合中有某个数据,就把他移除,否则就添加数据 // 注意这里数选择之后的状态 if (isChecked) { // 添加数据 list.add(array[which]); } else { // 移除数据 list.remove(array[which]); } } }). // 因为对话框不会自动消失,所以要添加按钮的必要 // 设置确定按钮 setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你选中了" + list, 0) .show(); } }). // 取消,什么都不做,对话框消失而已 setNegativeButton("取消", null). // 产生对话框,并显示出来 create().show();答案:ProgressDialog类是AlertDialog的子类,但是对象的创建不是使用Builder模式,而是new出来的。 并且进度条可以显示圆形的进度条或水平样式的进度条,示例代码:
// 创建进度条的对话框 ProgressDialog dialog = new ProgressDialog(this); // 设置进度条的样式,选择圆形或条状 // 这里这圆形的 dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 设置标题 dialog.setTitle("文件下载"); // 设置文本信息 dialog.setMessage("正在下载。。。"); // 设置是否能用后退键出对话框 // 选择false就代表不能 // 如果设置为false,程序可能退出不了 dialog.setCancelable(true); // 显示对话框 dialog.show();答案:使用AlertDialog.Builder.setView方法可以在对话框上显示一个View。该View的对象可以使用java代码创建,也可以从布局文件中加载。
答案:一般有三种显示对话框的方式: 1.使用AlertDialog显示对话框 2.使用Theme.Dialog将Activity主题改成对话框风格,一般是在布局中设置,示例代码:
答案:使用setGravity方法可以设置对话框的位置,下面的代码让对话框在屏幕左上角显示。
AlertDialog alertDialog=new AlertDialog.Builder(this) .setMessage(“在顶端显示对话框”) .setPositiveButton(“确定”,null).create(); //获取Window对象 Window window=alertDialog.getWindow(); //调用setGravity方法是对话框在屏幕左上方显示 window.setGravity(Gravity.TOP|Gravity.LEEF); alertDialog.show();解析:AlertDialog类中有一个mString变量,如果把这个变量变为false时,系统会认为对话框已经关闭而不再关闭对话框,但是需要用到反编译的知识! 答案:只要在按钮点击事件中修改AlertDialog.mShowing变量的值即可,代码如下:
try{ Field field=dialog.getClass().getSuperclass().getDeclaredField(“mString”); field.setAccessible(true); Field.set(dialog,false); }catch(Exception e){ }执行上面代码后,点击按钮后对话框就不会关闭!如果要关闭还需要重新将AlertDialog.mShowing变量的值设置为true。
答案:通过设置Window的alpha属性可以改变对话框的透明度,代码如下:
AlertDialog alertDialog=new AlertDialog.Builder(this) .setMessage(“透明的对话框”) .setPositiveButton(“确定”,null).create(); Window window=alertDialog.getWindow(); windowManager.LayoutParams lp=window.getAttributes(); //设置透明度为0.7f Lp.alpha=0.7f;//alpha的范围从0f到1f,默认是1f表示不透明,0f代表完全透明! window.setAttributtes(lp); alertDialog.show();AndroidSDK提供了两种用于显示提示信息的方式(吐司Toast和通知Notification)。这两种不同于对话框。对话框是独占方式的,也就说只有关闭对话框才能做其他的操作,而在显示Toast和Notifation时,并不会影响用户进行其他的操作。 Toast信息框 (一)请写出显示一个Toast信息框的Java代码。
Toast toast=Toast.makeText(this,”我的信息”,Toast.LENGTH_LONG); toast.show();解析:在系统内部会有一个队列来管理多个Toast。当前一个Toast信息框关闭后会从队列中获取下一个Toast信息框显示。这也是为什么Toast信息框会一个一个显示。而Toast.show方法并不是真正显示Toast信息框,而是将Toast信息框加入队列中。想要自己控制对话框的显示和关闭,就不能将Toast信息框放入队列中,并且需要直接显示和关闭Tost信息框的方法。在Toast类中有一个内嵌类TN,该类中有两个方法show和hide,分别用来显示和关闭Toast信息框。由于TN不是公开的,就需要反射来获得对象,再调用show和hide方法。 答案:调用Toast.TN.show和Toast.TN.hide方法可以直接显示和关闭Toast信息框,而且不会自动关闭,代码如下: 显示Toast信息框:
//先创建一个Toast对象 Toast toast=Toast.makeText(this,”不会自动关闭的Toast”,Toast.LENGTH_SHORT); Try{ //从Toast对象中获得mTN对象 Field field=toast.getClass().getDeclaredField(“mTN”); field.setAccessible(true); Object object=field.get(toast); //从TN对象中获得了show方法 Method method=obj.getClass().getDeclaredMethod(“show”,null); //调用show方法来显示Toast信息框 method.invike(obj,null); }catch(Exception e){}关闭Toast信息框:
tyr{ Method method=obj.getClass().getDeclaredMethod(“hide”,null); Method.invoke(obj,null); }catch(Exception e){ }解析:Toast信息框可以在完全满足这个条件,很有PopupWindow也可以达到这个目的。 答案:最简单的方法可以采用Toast信息框,并通过反射技术调用Toast.TN.show和Toast.TN.hide方法直接控制Toast信息的显示和关闭。除了Toast信息框外,还可以使用PopupWindow对象显示一个类似Toast信息框的窗口,代码如下:
View view=etLayoutInflater().inflate(R.laout.toast,null); PopupWindow popupWindow=new PopupWindow(layout,200,100); popupWindow.setTouchable(false); //显示一个窗口 popupWindow.showAtLocation(layout,Gravity.CENTER_HORIZONTAL,20,0); //关闭窗口的代码 popupWindow.dismiss();通知(Notificaiton)
答案:创建和显示一个Notification需要5步: 1.通过getSystemService方法获得一个NotificationManager对象。 2.创建一个Notification对象。每一个Notification对应一个Notificaiton对象。这一步需要设置显示在屏幕上方状态栏的通知消息、通知消息前方的图像资源ID和发出通知的时间,一般为当前时间。 3.由于Notification可以与应用程序脱离,也就是说,即使应用程序被关闭,Notification仍然会显示在状态栏中。 当程序再次启动后,又可以重新控制这些Notification,如清除或替换它们。因此,需要创建一个PendingIntent对象。该对象由Android系统负责维护,因此,在程序关闭后,对象仍然不会被释放。 4.使用Notification类的setLatesEvenInfo方法设置Notification的详细信息。 5.使用NotificationManiger类的notify方法显示Notification消息。在这一步需要指定标识Notification的唯一ID。这个ID必须相对同一个NotificationManager对象时唯一的,否则就会覆盖相同的ID的Notification。 显示Notification的java代码:
//第一步 NotificationManager notificationManager =(NotificationManager)getSystemService(NOTIFICATION_SERVICE); //第二步 Notification notification=new Notification(R.drawable.icon,”你有新消息了!”,System.currentTimeMillis()); //第三步 PendingIntent contentIntent=PendingIntent.getActivity(this,0,getIntent(),0); //第四步 notification.setLatesEventInfo(this,”天气预报”,”晴转多云”,contentIntent); //第五步 notificationManager.notify(R.drawable.icon,notification);答案:使用PendingIntent.getActivity方法获取一个PendingIntent对象,并将PendingIntent对象传入setLatesEventInfo方法的最后一个参数。主要代码:
PendingIntent contentIntent=PendingIntent.getActivity(this,0,new Intent(this,Main.class),0); notification.setLatesEventInfo(this,”title”,”content”,contentIntent);扩展:点击Notification触发的动作 单击Notification后不仅可以弹出一个Activity,还可以发送广播或开始一个服务。这两个动作都需要依靠PaddingIntent对象,代码如下: //发送广播:
Intent intent=new Intent(“MyBroadcast”); PenddingIntent penddingIntent=new PenddingIntent.getBroadcast(this,1,intent,PenddingIntent.FLAG _UPDATE_CURRENT);//开始服务
Intent intent=new Intent(this,MyService.class); PenddingIntent penddingIntent=new PenddingIntent.getService(this,1,intent,PenddingIntent.FLAG_UPDATE_CURRENT);答案:如果想从状态栏清除指定的Notification,可以使用NotificationManager.cancel方法,该方法只有一个参数,表示要清除的Notification的ID。使用cancelAll方法可以清除当前NotificationManager对象的所有通知Notification。
答案:设置Notification的flags属性,代码如下:
Notification notification=new Notification(R.drawable.smile,”收到短信了”,system.currentTimeMillis()); PenddingIntent penddingIntent=new PenddingIntent.getActivity(this,0,new Intent(this,Main.class),0); //将Notification放到“正在进行的”栏中 notification.flags=Notification.FLAG_ONGOING_EVENT; notification. setLatestEventInfo(this,”短信内容”,”最近在忙什么?”,penddingIntent); notificationManager.notify(R.drawble.smile,notification);答案:只需设置Notificaiton.contentView变量即可,代码如下:
Notification notification=new Notification(R.drawable.smile,”自定义Notificaion”,System.currentIimeMillis); PenddingIntent penddingIntent= PenddingIntent.getActivity(this,0,new Intent(this,Main.class),0); //R.layout.notification为自定义的Notificaiton布局文件 RemoteViews remoteView=new RemoteView(getPackageName(),R.layout.notication); remoteView.setTextViewText(R.id.textView,”更新自定义内容”); Notification.contentView=remoteView; notification.contentViewIntent=penddingIntent;自定义的Notification只支持如下的可视组件。 布局: 1.FrameLayout 2.LinearLayout 3.RelativeLayout
组件: 1.AnalogClock 2.Button 3.Chronomete 4.ImageButton 5.ImageView 6.ProgressBar 7.TextView
答案:选项菜单,上下文菜单,子菜单
答案:只有选项菜单的菜单项可以显示图像,上下文和子菜单的菜单头可以显示图像,但是菜单项不能显示图像。
答案:实现Activity.onCreateOptionMenu方法,并利用Menu对象添加菜单,代码如下:
public boolean onCreaateOptionMenu(Menu menu){ Menu.add(1,1,1,”菜单项1”); Menu.add(1,2,2,”菜单项2”); Menu.add(1,3,3,”菜单项3”); return true; }扩展知识:绑定上下文菜单 上下文菜单应与某些可视视图组件绑定,首先需要实现一个创建上下文菜单的onCreateContextMenu方法,代码如下:
public void onCreateContextMenu( ContextMenu menu,View view,ContextMenuInfo menInfo){ menu.add(1,1,1,”上下文菜单项1”); menu.add(1,2,2,”上下文菜单项2”); menu.add(1,3,3,”上下文菜单项3”); }然后需要使用registerForContextMenu方法将上下文菜单与可视组件绑定在一起,代码如下: Button buton=(Button)findViewById(R.id.btnAddMenu); registerForcontextMenu(buton); 长按 Button,就会弹出OnCreateContextMenu方法创建 的上下文菜单。
答案:可以将一个Activity与某个菜单项关联,这样在单击该菜单时就会自动显示Activity。关联菜单项与Activity的代码如下:
MenuItem menuItem=menu.add(1,1,1,“菜单项”); //将Activity与菜单项关联 menuItem.setInetent(new Intent(this,MyActivity.class));答案:有如下3个方法可以响应菜单项的点击事件 1.OnMenuItemClick 2.OnOptionsItemSelected 3.OnMenuItemSelected
扩展:多个菜单项的点击事件如何响应 当同时设置三种菜单项的点击事件时,当O你MenuItemClick方法返回true时,其他两个点击事件无效;当设置后面两种点击事件时,系统会根据这两个方法在父类(Activity类)的位置决定,先调用的方法生效! (六)下图是一个选项菜单项的子菜单,请写出创建这个子菜单的核心代码。 答案:创建带复选框和选项按钮的子菜单的代码如下:
public boolean onCreateOptionMenu(Menu menu){ //添加子菜单 SubMenu fileSubMenu=menu.addMenu(1,1,1,“文件”); //设置在选项菜单中显示的图像 fileSubMenu.setIcon(R.drawable.file); //设置子菜单的图像 fileSubMenu.setHeaderIcon(R.drawable.headerfile); MenuItem newMenuItem=fileSubMenu.add(1,2,2,”新建”); //将第一个子菜单项设置成复选框的类型 newMenuItem.setCheckable(true); //选中第一个子菜单项的复选框 newMenuItem.setChecked(true); MenuItem openMenuItem=fileSubMenu.add(2,3,3,”打开”); MenuItem exitMenuItem=fileSubMenu.add(2,3,3,”退出”); //将第三个菜单项的选型按钮设为选中状态 exitMenuItem.setChecked(true); //将后面两个子菜单项设置成选项按钮类型 fileSubMenu.setGroupCheckable(2,true,true); }解析:本题考点主要有两点: 1.如何显示和关闭自定义选项菜单 2.自定义选项菜单用什么实现 答案:选项菜单通过手机的“menu”键弹出,当按“back”键时,选项菜单会关闭。因此,只需在onKeyDown方法中截获“menu”和“back”键即可。 可以使用PopupWindow对象来模拟选型菜单。在创建PopupWindow对象时需要一个View对象(一般从布局文件中装载),创建、显示、关闭自定义选项菜单的代码如下:
public boolean onKeyDown(int keyCode,KeyEven keyEven){ switch(keyCode){ case KeyEvent.KEYCODE_MENU://按下menu键的动作 //选项菜单已经弹出,不再弹出新的窗口 if(state==1){ return false; } //装载选项菜单布局文件 layout=getLayoutInflater().inflate(R.layout.menu_layout,null); //创建PopupWindow对象,并在指定位置弹出用于显示菜单的窗口 pop=new PopupWindow(layout,getWindowManager().getDefaultDisplay().getWidth(),getWindowManager().getDefaultDisplay().getHeight()); //设置弹出窗口的位置 pop.showAtLocation(layout,Gravity.BOTTOM,0,0); //弹出选项菜单后,键状态设置为1,表示已经弹出选项菜单 state=1; retuen false; case KeyEvent.KEYCODE_BACK://按下back键的动作 if(state==1){ //如果选项菜单已经弹出,关闭它 pop.dismiss(); //将状态变量设置为菜单栏关闭状态 state=2; }else(state==2){ //如果菜单栏还没显示,或已经关闭,则关闭当前Activity finish(); } return false; } }本文中的对话框和吐司提示还是用得比较多的,后面的知识现在很少用了。
之前我也有一个对对话框非常详细的总结: http://blog.csdn.net/wenzhi20102321/article/details/52818351