当前位置: 代码迷 >> Android >> 【Android】各种各样的弹出框与对菜单键、返回键的监听
  详细解决方案

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

热度:72   发布时间:2016-04-28 00:18:49.0
【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);	}}


  相关解决方案