转自https://blog.csdn.net/wenzhi20102321/article/details/60868763,感谢作者的无私分享。
Android面试宝典总结
–第四章:对话框、信息提示和菜单
本文对Android面试宝典的面试题目做一点总结和记录,希望对大家有帮助。
一.对话框
(一)Android的标准对话框最多可以有几个按钮?写出显示对话框按钮的方法。
解析:对话框的显示使用的是AlertDialog,它的串模式也是Builder模式!
答案:Android的标准对话框最多可以有三个按钮,AlertDialog.Builder类提供了3个直观的显示按钮的方法:setPositiveButton(左起第1)、setNeutralButton(第2)、setNegativeButton(第3).
(二)如何响应Android标准对话框的按钮点击事件,请举例说明。
答案:AlertDialog.Builder类的方法:setPositiveButton、setNeutralButton、setNegativeButton,可以设置按钮点击事件监听对象,例如,下面的按钮响应了第一个按钮的点击事件:
new AlertDialog.Builder(this)
.setTitle(“我的对话框”)
.positiveButton(“确定”,new
DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int whichButton){
//响应按钮的点击事件的代码
}
}).show();
(三)如何只使用AlertDialog,而不使用外部布局的情况下在对话框中显示一个列表(列表项内只包含一行文字,数据源是String[]类型的值),并响应每一个列表项的单击事件?
解析:本题考查的是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方法可以在对话框上显示列表,也可以在后面添加选项按钮。
示例代码:
public void showSingleChoiceDialog() {
final StringBuffer stringBuffer = new StringBuffer();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher).setTitle("单选对话框");
final String[] items = new String[] {"北京", "纽约", "曼谷", "伦敦"};
builder.setSingleChoiceItems(items, -1,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this,"你点击了:" + items[i], Toast.LENGTH_SHORT).show();
stringBuffer.delete(0,stringBuffer.length());
stringBuffer.append(items[i]);
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"你最终了选择:" + stringBuffer.toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
}
(五)多选列表项对话框的显示?
答案:使用ALertDialog.Builder.setMultiChoiceItems方法,示例代码:
public void showMultiChoiceDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher).setTitle("多选对话框");
final String[] items = new String[] {"北京", "纽约", "曼谷", "伦敦"};
final StringBuffer stringBuffer = new StringBuffer();
final Set set=new HashSet<String>();
//初始化选中状态
boolean[] booleans = {true, false, true, false};
for(int i=0;i<booleans.length;i++){
if(booleans[i]){
set.add(items[i]);
}
}
builder.setMultiChoiceItems(items,booleans,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
Toast.makeText(MainActivity.this, "你点击了:" + items[i], Toast.LENGTH_SHORT).show();
if(b){
set.add(items[i]);
}else{
set.remove(items[i]);
}
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Iterator iterator = set.iterator();
while(iterator.hasNext()){
stringBuffer.append(iterator.next()+" ");
}
Toast.makeText(MainActivity.this, "你最终选中了:" + stringBuffer.toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
}
(六)请描述一下进度对话框(ProgressDialog)的使用方法。
答案: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代码创建,也可以从布局文件中加载。
(八)在Android中显示对话框有几种方式?
答案:一般有三种显示对话框的方式:
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弹出对话框无论点击任何按钮都会关闭对话框。如果想在点击按钮后执行一些代码,并由自己来控制对话框的关闭应该如何做呢?
解析: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();
- 1
- 2
(二)显示Toast信息框后会在一定时间内自动关闭,有没有办法自己来控制Toast信息的显示和关闭?
解析:在系统内部会有一个队列来管理多个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的实现步骤,并写出相应的java代码。
答案:创建和显示一个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);
(五)如何做才能在点击Notification后弹出一个Activity?
答案:使用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?
答案:如果想从状态栏清除指定的Notification,可以使用NotificationManager.cancel方法,该方法只有一个参数,表示要清除的Notification的ID。使用cancelAll方法可以清除当前NotificationManager对象的所有通知Notification。
(七)如何将Notification放在如下图所示“正在进行的”的位置(在该栏中Notification是永久存在的,除非使用NotificationManager.cancel该方法清除该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);
(八)如何自定义Notification, 并说出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
三.菜单
(一)Android支持哪几种菜单?
答案:选项菜单,上下文菜单,子菜单
(二)哪些Android支持的菜单中菜单项可以显示图像
答案:只有选项菜单的菜单项可以显示图像,上下文和子菜单的菜单头可以显示图像,但是菜单项不能显示图像。
(三)请描述一下如何为一个 Activity添加选项菜单
答案:实现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方法创建 的上下文菜单。
(四)在点击菜单项时,除了使用Java代码显示一个Activity外,还可以用什么方法显示Activity?
答案:可以将一个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