Android自带各式各样的弹出框,弹出框也是安卓基本的组件之一。同时安卓程序可以对菜单键、返回键的监听,但在安卓4.0之后就禁止对Home键的屏蔽与监听,强制保留为系统守护按键,如果非要对Home键的屏蔽与监听,就会出现java.lang.IllegalArgumentException: Window type can not be changed after the window is added.的错误。

下面写一个小程序,来说明Android各式各样的弹出框,同时,安卓是如何对菜单键、返回键的监听。

如下图:


按下Menu键则在弹出消息,

之后这个程序提供各式各样的弹出框。

每一个弹出框添加不同的监听器,用来监听用户对各个按钮的点击。

最后按下返回键,结束这个程序。

这个程序比较简单,就一个Activity。

1、首先是在res\values\strings.xml设置app名字与各个按钮的显示内容如下:

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">弹出框</string>    <string name="action_settings">Settings</string>    <string name="button1">带多按钮的弹出框</string>    <string name="button2">带列表的弹出框</string>    <string name="button3">带单选列表的弹出框</string>    <string name="button4">带多选列表的弹出框</string></resources>
2、之后,与《【Android】利用Notification操作设备的通知栏》( 点击打开链接),在res\layout\activity_main.xml设置一个自上而下的线性布局。摆放四个按钮,分别给四个按钮,设置不同的id,一会儿在MainActivity.java进行监听。各式各样的弹出框是通过java生成的。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button1"        android:textSize="24sp" />    <Button        android:id="@+id/button2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button2"        android:textSize="24sp" />    <Button        android:id="@+id/button3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button3"        android:textSize="24sp" />    <Button        android:id="@+id/button4"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button4"        android:textSize="24sp" /></LinearLayout>

3、最后是对MainActivity.java文件的编写。整个程序分为两部分,一个是获取各个按钮之后,对不同按钮的点击事件,添加各式各样的点击事件,里面生成不同的弹出框。带多按钮的弹出框通过AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();创建,带列表的对话框,则通过AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);去创建。它们都可以通过setIcon与setTitle设置图标与标题,但是之后的监听器的标题是不同的。注意监听器的重名问题,重名的监听器,必须在声明其所在类进行区分,否则无法通过编译。

程序另一部分是对物理按钮的监听,这个很简单的。无需使用xml进行声明,直接写监听代码即可。

package com.alertdialog;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import android.widget.Toast;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnMultiChoiceClickListener;public class MainActivity extends Activity {private Button button1;private Button button2;private Button button3;private Button button4;private String[] listItems = new String[] { "选项1", "选项2", "选项3", "选项4" };// 选项列表项数组@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1 = (Button) findViewById(R.id.button1);button2 = (Button) findViewById(R.id.button2);button3 = (Button) findViewById(R.id.button3);button4 = (Button) findViewById(R.id.button4);// 这里的普通按钮点击监听器与对话框按钮的点击监听器是不同的,要声明是View这个类button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();alertDialog.setIcon(R.drawable.ic_launcher);// 设置对话框的图标为应用程序的图标alertDialog.setTitle("带多按钮的弹出框");alertDialog.setMessage("对话框的内容");// 这里的对话框按钮的点击监听器与普通按钮点击监听器是不同的,要声明是DialogInterface这个类alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "取消按钮被点击",Toast.LENGTH_LONG).show();}});// 不想要这个按钮则不写这个方法alertDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "中立按钮被点击",Toast.LENGTH_LONG).show();}});// 不想要这个按钮则不写这个方法alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "OK按钮被点击",Toast.LENGTH_LONG).show();}});alertDialog.show();// 必须要有这个方法,否则对话框不显示}});button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 这里区别与其它组件的builder,必须这样写builder.setIcon(R.drawable.ic_launcher);// 设置对话框的图标为应用程序的图标builder.setTitle("带列表的弹出框");builder.setItems(listItems,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {Toast.makeText(MainActivity.this,listItems[which] + "被点击",Toast.LENGTH_LONG).show();}});builder.create().show();// 必须要有这个方法,否则对话框不显示}});button3.setOnClickListener(new View.OnClickListener() {private String chooseItem;// 用于记录被选择的项@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 这里区别与其它组件的builder,必须这样写builder.setIcon(R.drawable.ic_launcher);// 设置对话框的图标为应用程序的图标builder.setTitle("带列表的弹出框");builder.setSingleChoiceItems(listItems, 0,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {chooseItem = listItems[which];}});builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {Toast.makeText(MainActivity.this,chooseItem + "被点击", Toast.LENGTH_LONG).show();}});builder.create().show();// 必须要有这个方法,否则对话框不显示}});button4.setOnClickListener(new View.OnClickListener() {private boolean[] checkedItems;// 用于记录被选择的项@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 这里区别与其它组件的builder,必须这样写builder.setIcon(R.drawable.ic_launcher);// 设置对话框的图标为应用程序的图标builder.setTitle("带列表的弹出框");checkedItems = new boolean[] { false, false, true, true };// 初始化被选择的项builder.setMultiChoiceItems(listItems, checkedItems,new OnMultiChoiceClickListener() {// 多项选择监听器是独立的,所以在前面无须声明其所在类@Overridepublic void onClick(DialogInterface arg0,int which, boolean isChecked) {// TODO Auto-generated method stubcheckedItems[which] = isChecked;// 任意一项被选择与否,其对应数组的布尔值会被改变}});builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {// 寻找被选择项所对应的选项String result = "";for (int i = 0; i < checkedItems.length; i++) {if (checkedItems[i]) {result += listItems[i] + ",";}}if (!result.equals("")) {// 如果用户有选择东西Toast.makeText(MainActivity.this,result + "被选择", Toast.LENGTH_LONG).show();} else {Toast.makeText(MainActivity.this,"没有选项被选择", Toast.LENGTH_LONG).show();}}});builder.create().show();// 必须要有这个方法,否则对话框不显示}});}//对物理按钮的监听@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_MENU:Toast.makeText(MainActivity.this, "菜单键被按下", Toast.LENGTH_LONG).show();break;case KeyEvent.KEYCODE_BACK:finish();break;}return super.onKeyDown(keyCode, event);}}


更多相关文章

  1. android ImageButton示例
  2. Android(安卓)Fragment用法详解(2)--动态添加Fragment
  3. android java开发 第二天 之熟悉 程序开发流程
  4. Android(安卓)Studio Intent使用(显式、隐式) 第一行代码
  5. 新浪微博布局学习――妙用TabHost
  6. Android(安卓)View 仿iOS SwitchButton
  7. Android编程基础之简单Button事件响应综合提示控件Toast应用示例
  8. Android中的ANR异常及traces解析
  9. Android倒计时定时器CountDownTimer的用法

随机推荐

  1. Android本地数据存储之Sharedpreference
  2. Android(安卓)Activity启动模式分析
  3. android中加载大图片到内存
  4. android keytool 不是内部命令或外部命令
  5. android_防止被反编译 混淆
  6. Android中activity的启动模式详解
  7. 解决 Android(安卓)模拟器 无法上网问题
  8. Android(安卓)设定横屏,禁止屏幕旋转,Activ
  9. Android根据文件路径使用File类获取文件
  10. Android读写XML(上)