您的位置:首页 > 职场人生

Android面试宝典总结 --第四章:对话框、信息提示和菜单

2017-03-08 11:05 453 查看

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方法可以在对话框上显示列表,也可以在后面添加选项按钮。

示例代码:

// 单选按钮的对话框,选择一个按钮值后,
// 对话框也是不会自动消失,需要自己关闭
// 要设置按钮,点击按钮后对话框才会消失
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)的使用方法。

答案: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();


(二)显示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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: