【Android】各式各样的弹出框与对菜单键、返回键的监听

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" };// 选项列表项数组

	@Override
	protected 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() {

			@Override
			public 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() {

							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								// TODO Auto-generated method stub
								Toast.makeText(MainActivity.this, "取消按钮被点击",
										Toast.LENGTH_LONG).show();
							}
						});
				// 不想要这个按钮则不写这个方法
				alertDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立",
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								// TODO Auto-generated method stub
								Toast.makeText(MainActivity.this, "中立按钮被点击",
										Toast.LENGTH_LONG).show();
							}
						});
				// 不想要这个按钮则不写这个方法
				alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface arg0, int arg1) {
								// TODO Auto-generated method stub
								Toast.makeText(MainActivity.this, "OK按钮被点击",
										Toast.LENGTH_LONG).show();
							}
						});
				alertDialog.show();// 必须要有这个方法,否则对话框不显示
			}
		});
		button2.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				AlertDialog.Builder builder = new AlertDialog.Builder(
						MainActivity.this);// 这里区别与其它组件的builder,必须这样写
				builder.setIcon(R.drawable.ic_launcher);// 设置对话框的图标为应用程序的图标
				builder.setTitle("带列表的弹出框");
				builder.setItems(listItems,
						new DialogInterface.OnClickListener() {

							@Override
							public 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;// 用于记录被选择的项

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				AlertDialog.Builder builder = new AlertDialog.Builder(
						MainActivity.this);// 这里区别与其它组件的builder,必须这样写
				builder.setIcon(R.drawable.ic_launcher);// 设置对话框的图标为应用程序的图标
				builder.setTitle("带列表的弹出框");
				builder.setSingleChoiceItems(listItems, 0,
						new DialogInterface.OnClickListener() {

							@Override
							public void onClick(DialogInterface arg0, int which) {
								chooseItem = listItems[which];
							}
						});
				builder.setPositiveButton("确定",
						new DialogInterface.OnClickListener() {

							@Override
							public 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;// 用于记录被选择的项

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				AlertDialog.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() {
							// 多项选择监听器是独立的,所以在前面无须声明其所在类
							@Override
							public void onClick(DialogInterface arg0,
									int which, boolean isChecked) {
								// TODO Auto-generated method stub
								checkedItems[which] = isChecked;// 任意一项被选择与否,其对应数组的布尔值会被改变
							}
						});
				builder.setPositiveButton("确定",
						new DialogInterface.OnClickListener() {

							@Override
							public 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();// 必须要有这个方法,否则对话框不显示
			}
		});
	}

	//对物理按钮的监听
	@Override
	public 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);
	}
}
时间: 2024-11-17 04:46:22

【Android】各式各样的弹出框与对菜单键、返回键的监听的相关文章

Android窗口为弹出框样式

1.XML android:theme="@android:style/Theme.Dialog <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.fish.helloworld" android:versio

android 三种弹出框之一poprpWindow

poprpWindow 在android的弹出框我目前了解到的是有三种:AlertDialog,poprpWindow,Activity伪弹框, AlertDialog太熟悉了,这里就不介绍了 就先看看poprpWindow API 给出的解释是: 意思就是一个展示view的弹出窗体,这个弹出窗体将会浮动在当前activity的最上层, 它和AlertDialog的区别是:在android中弹出框有两种方式:AlertDialog和PopupWindow,它们的不同点在于:      1.Ale

android service Dialog 弹出框

android service Dialog 弹出框 相信大家第一次在Service中实现 AlertDialog 弹出框时,都会遇到应用闪退然后报出这个异常: Caused by: android.view.WindowManager$BadTokenException: 下面说下为什么出现这个异常,原因很简单,是由于 AlertDialog 的显示是依赖于一个确定的Activity类,所以要想在 Service 中实现弹出来,需要做如下配置: 1.安装常规写好 AlertDialog 功能块

[转]Android应用中返回键的监听及处理

用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下: 标签:    Android SDK 代码片段(2) [全屏查看所有代码] 1. [图片] 截图 2. [代码][Java]代码     跳至                         [2]     [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Android应用中返回键的监听及处理

MainActivity如下: package com.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; import android.app.Activity; /** * Demo描述: * 处理Back键按下事件 * * 注意事项: * 以下两种方法勿一起使用 */ public class MainActivity extends Activity { @Override protected

Android 关于Dialog弹出框

直接上效果图: 实现步骤: 1.主界面activity_main.xml很简单,一个按钮 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

android开发学习 ------- 弹出框

这是一种方法,是我觉得简单易懂代码量较少的一种: /* 创建AlertDialog对象并显示 */ final AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this).create(); alertDialog.show(); /* 添加对话框自定义布局 */ alertDialog.setContentView(R.layout.dialog_login); /* 获取对话框窗口 */ Window windo

Android 开发笔记 “弹出框”

AlertDialog.Builder builder = new AlertDialog.Builder(Activity.this); builder.setMessage("Are you sure you want to exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(Dial

【Android】使用Intent调用系统其它程序,使用onKeyDown对音量键的监听,长按事件

Intent在安卓编程中非常常见,在<[Android]多个Activity之间利用bundle传递数值>(点击打开链接)中已经展示了它可以唤醒其它Activity并在Activity之间传递数据.其实Intent的作用远非于此,它还可以调用系统中其它固有程序,比如拨打电话.发送短信等.onKeyDown也是如此,不仅仅可以对设备的菜单键进行监听,这在<[Android]各式各样的弹出框与对菜单键.返回键的监听>(点击打开链接)中已经展示过的,对设备的音量调节键也是可以监听的, 下