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

 转自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)?

z

答案:设置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类)的位置决定,先调用的方法生效! 
(六)下图是一个选项菜单项的子菜单,请写出创建这个子菜单的核心代码。 
z2 
答案:创建带复选框和选项按钮的子菜单的代码如下:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值