Android面试简录——对话框、信息提示和菜单


* 对话框

  • Android的标准对话框最多可以有几个按钮,并写出显示对话框按钮的方法。
    天天乐彩票_[官网首页]标准对话框——AlertDialog类。
    最多有3个按钮,显示方法:setButton(),setButton2(),setButton3()。
    AlertDialog.Build提供更直观的显示方法:setPositiveButton(),setNeutralButton(),setNegativeButton()。

  • 如何响应Android标准对话框的按钮单击事件?
    设置按钮单击事件监听对象:
    AlertDialog.setButton,AlertDialog.setButton2,AlertDialog.setButton3
    AlertDialog.Builder.setPositiveButton,AlertDialog.Builder.setNeUtralButton,AlertDialog.Builder.setNegativeButton.
    举例:
    new AlertDialog.Builder(this).setTitle("我的对话框").setPositiveButton("关闭", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    //响应按钮单击事件
    }
    }).show();

  • 如何将字符串数组作为数据源以列表方式显示在标准对话框中,并在列表项后面加上选项按钮?
    AlertDialog.Builder.setSingleChoiceItems.
    实例:
    new AlertDialog.Builder(this).setTitle("我的对话框").setPositiveButton("关闭", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    //响应按钮单击事件
    }
    }).show();

    String[] yourname = {"Nancy", "Mike", "Join", "Bob"};
    new AlertDialog.Builder(this).setTitle("choice your name").setSingleChoiceItems(yourname, -1, new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            index = which;
        }
    }).setPositiveButton("OK", new OnClickListener() {
        public void onClick(AlertDialog dialog, int which) {
            new AlertDialog.Builder(Main.this).setMessage("your choice is:" + yourname[index]).show();
        }
    }).show();
    
  • 请描述以下进度条对话框(ProgressDialog)的使用方法。
    android.app.ProgressDialog。
    设置最大进度值:setMax
    设置当前进度值:setProgress
    指定进度增量:incrementProgressBy
    实例:
    ProgressDialog progressDialog = new ProgressDialog(this);
    progressDialog.setIcon(R.drawable.wait);
    progressDialog.setTitle("正在处理数据...");
    progressDialog.setMessage("请稍候...");
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setMax(100);
    progressDialog.setProgress(20);
    progressDialog.setButton("暂停", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    //处理
    }
    });
    progressDialog.setButton2("取消", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    //处理
    }
    });
    progressDialog.show();

  • 如何在标准对话框中任意放置可视组件?
    AlertDialog.Builder.setView.

  • 在Android中显示对话框有几种方式?
    1.使用AlertDialog显示对话框
    2.使用Activity自定义对话框(Theme.Dialog)
    3.使用Activity.showDialog(int)

  • 怎样改变对话框在屏幕上的显示位置?
    setGravity.
    实例:
    AlertDialog alertDialog = new AlertDialog.Builder(this).setPositiveButton("确定", null).create();
    alertDialog.setMessage("在顶端显示对话框");
    Window window = alertDialog.getWindow();
    window.setGravity(Gravity.TOP | Gravity.LEFT);
    alertDialog.show();

  • 天天乐彩票_[官网首页]使用AlertDialog弹出的对话框无论单机任何按钮都会关闭对话框。如果想在单击按钮后执行一些代码,并由自己来控制对话框的关闭应如何做呢?
    在AlertDialog中有一个mShowing变量:
    天天乐彩票_[官网首页]mShowing = true:对话框正在显示,系统会关闭对话框。
    mShowing = false:系统认为对话框已关闭。
    try {
    Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
    field.setAccessible(true);
    field.set(dialog, false);
    } catch (Exception e) {

    }
    
  • 如何改变对话框的透明度?
    Window.alpha.
    AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle("半透明对话框").setPositiveButton("确定", null).create();
    Window window = alertDialog.getWindow();
    WindowManager.LayoutParams lp = window.getAttributes();
    lp.alpha = 0.7f;
    window.setAttributes(lp);
    alertDialog.show();


* 信息提示

Android SDK提供了两种用于显示信息的方式:Toast 和 Notification.

Toast提示框

  • 请写出一个显示Toast信息框的Java代码
    Toast textToast = Toast.makeText(this, "我的信息", Toast.LENGTH_LONG);
    textToast.show();

  • 判断下列写法是否正确?
    正确:
    Toast textToast = Toast.makeText(this, "我的信息", Toast.LENGTH_LONG); //这里的makeText会创建一个带TextView的Toast对象
    textToast.setText("谁的信息");
    textToast.show();
    错误:
    Toast toast = new Toast(this); //这里的new会创建一个Toast对象
    toast.setText("我的信息");
    textToast.show();
    正确:
    View view = getLayoutInflater().inflate(R.layout.dialog, null);
    Toast toast = new Toast(this);
    toast.setView(view); //在创建的Toast对象里加入自定义的View对象
    toast.show();

  • 怎么控制Toast信息框的显示和关闭?
    在系统内部会使用一个队列来管理多个Toast。
    Toast.show():只是把Toast加入到队列中。
    天天乐彩票_[官网首页]控制显示和关闭:不能把Toast放入队列中,需要直接调用显示和关闭的方法。
    Toast中有个内嵌类TN:show/hide.
    通过反射获取TN对象,调用show/hide。
    Toast toast = Toast.makeText(this, "永不关闭的Toast", Toast.LENGTH_LONG);
    try {
    Field field = toast.getClass().getDeclaredField("mTN");
    field.setAccessible(true);
    Object obj = field.get(toast);
    Method method = obj.getClass().getDeclaredMethod("show", null);
    method.invoke(obj, null);
    } catch (Exception e) {

    }
    
  • 如何显示一个不可获得焦点,也不影响用户进行其他操作的窗口?
    1.Toast
    2.PopupWindow:
    View layout = getLayoutInflater().inflate(R.layout.toast, null);
    PopupWindow popupWindow = new PopupWindow(layout, 200, 100);
    popupWindow.setTouchable(false);
    popupWindow.showAtLocation(layout, Gravity.CENTER_HORIZONTAL, 20, 0);
    关闭:popupWindow.dismiss();


通知:Notification

  • 请描述一下在状态栏上显示Notification的实现步骤。
    1.getSystemService -> NotificationManager
    2.创建一个Notification对象
    3.创建PendingIntent对象
    4.Notification对象.setLastestEventInfo -> 设置Notification的详细信息。
    5.NotificationManager.notify(ID) -> 显示Notification信息
    实例:
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.icon, "您有新消息了", System.currentTimeMillis());
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, getIntent(), 0);
    notification.setLatestEventInfo(this, "天气预报", "晴转多云", contentIntent);
    notificationManager.notify(R.drawable.icon, notification);
  • 怎样单击Notification后弹出一个Activity?
    1.使用PendingIntent.getActivity -> PendingIntent对象
    2.setLastestEventInfo(...,PendingIntent对象)

【拓展】单击Notification后触发的动作:
Activity/BroadcastReceiver/Service。
发送广播:
Intent intent = new Intent("MYBROADCAST");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
开始服务:
Intent intent = new Intent(this, MyService.class);
PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

  • 如何从状态栏中清除Notification?
    NotificationManager.cancel(ID).
    NotificationManager.canelAll().
  • 如何将Notification放在“正在进行的”栏中?(永久存在,除非用cancel方法清除)
    设置Notification的flags属性:
    Notification notification = new Notification(R.drawable.smile, "收到短信了", System.currentTimeMillis());
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, Main.class), 0);
    notification.flags = Notification.FLAG_ONGOING_EVENT;
    notification.setLatestEventInfo(this, "短信内容", "最近在忙什么", pendingIntent);
    notificationManager.notify(R.drawablw.smile, notification);
  • 如何自定义Notification,并说出Notification支持哪些可视组件?
    设置Notification.contentView变量。
    如下:
    Notification notification = new Notification(R.drawable.smile, "自定义Notification", System.currentTimeMillis());
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, Main.class), 0);
    RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification);
    remoteViews.contentView = remoteViews;
    remoteViews.contentIntent = pendingIntent;
    支持的可视组件:
    布局:FrameLayout/LinearLayout/RelativeLayout
    组件:AnalogClock/Button/Chronometer/ImageButton/ImageView/ProgressBar/TextView

* 菜单

  • Android支持哪几种菜单?
    天天乐彩票_[官网首页]选项菜单,上下文菜单,子菜单。
  • 哪些Android支持的菜单中菜单项可以显示图像?
    选项菜单。
    其他两种的菜单头可以显示图像,但是菜单项不能显示。
  • 如何为一个Activity添加选项菜单?
    天天乐彩票_[官网首页]实现Activity.onCreateOptionsMenu方法,并利用Menu对象添加菜单。
    public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(1, 1, 1, "菜单项1");
    menu.add(1, 2, 2, "菜单项2");
    menu.add(1, 3, 3, "菜单项3");
    return true;
    }

【拓展】registerContextMenu -> 将上下文菜单与可视组件绑定
Button button = (Button) findViewById(R.id.button);
registerForContextMenu(button);

  • 怎么用菜单项显示Activity?
    MenuItem menuItem = menu.add(1, 1, 1, "菜单项");
    addMenuItem.setIntent(new Intent(this, MyActivity.class));
  • 响应菜单项单击事件有哪些方法?
    1.onMenuItemClick
    2.onOptionsItemSelected
    3.onMenuItemSelected

【拓展】多个菜单项事件如何响应?
1.当onMenuItemClick方法返回true时,另两种方法都失效了。
天天乐彩票_[官网首页]2.未设置onMenuItemClick时:根据在onMenuItemSelected方法中调用父类的onMenuItemSelected方法的位置决定先调用哪个方法。
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
//在super.onMenuItemSelected(featureId, item)中调用了onOptionsItemSelected方法
super.onMenuItemSelected(featureId, item);
Log.d("onMenuItemSelected:ItemId=", String.valueOf(item.getItemId()));
return true;
}

  • 如何自定义选项菜单?
    1.显示和关闭自定义选项菜单:在onKeyDown方法中截获按"menu","back"键的动作。
    2.自定义菜单实现:PopupWindow对象模拟选项菜单。
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode) {
    case KeyEvent.KEYCODE_MENU:
    if (state == 1)
    return false;
    layout = getLayoutInflater().inflate(R.layout.menu_layout, null);
    pop = new PopupWindow(layout,
    getWindowManager().getDefaultDisplay().getWidth(),
    getWindowManager().getDefaultDisplay().getHeight());
    pop.showAtLocation(layout, Gravity.BOTTOM, 0, 0);
    state = 1;
    return false;
    case KeyEvent.KEYCODE_BACK:
    if (state == 1) {
    pop.dismiss();
    state = 2;
    } else if (state == 2) {
    finish();
    }
    return false;
    }
    }

推荐阅读更多精彩内容