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

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

例如以下图:

按下Menu键则在弹出消息,

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

每个弹出框加入不同的监听器,用来监听用户对各个button的点击。

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

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

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

<?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文件的编写。整个程序分为两部分。一个是获取各个button之后,对不同button的点击事件,加入各式各样的点击事件,里面生成不同的弹出框。带多button的弹出框通过AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();创建,带列表的对话框,则通过AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);去创建。

它们都能够通过setIcon与setTitle设置图标与标题,可是之后的监听器的标题是不同的。

注意监听器的重名问题,重名的监听器,必须在声明其所在类进行区分。否则无法通过编译。

程序还有一部分是对物理button的监听。这个非常easy的。无需使用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);
}
}

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

  1. android 三种弹出框之一PopupWindow

    PopupWindow 在android的弹出框我目前了解到的是有三种:AlertDialog,PopupWindow,Activity伪弹框, AlertDialog太熟悉了,这里就不介绍了 就先看 ...

  2. Android 自定义界面的弹出框(可输入数据)

    上午写了一篇博文,介绍了如何定义从屏幕底部弹出PopupWindow,写完之后,突然想起之前写过自定义内容显示的弹出框,就随手写了两个实例,分享出来: 第一种实现方式:继承Dialog 1.1 线定义 ...

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

    MainActivity: package com.testnbackpressed;  import android.os.Bundle;  import android.view.KeyEvent ...

  4. Android窗口为弹出框样式

    1.XML android:theme="@android:style/Theme.Dialog <?xml version="1.0" encoding=&quo ...

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

    这是一种方法,是我觉得简单易懂代码量较少的一种: /* 创建AlertDialog对象并显示 */ final AlertDialog alertDialog = new AlertDialog.Bu ...

  6. Android 开发笔记 “弹出框”

    AlertDialog.Builder builder = new AlertDialog.Builder(Activity.this); builder.setMessage("Are y ...

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

    用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下:   标签:    Android ...

  8. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  9. android标题栏下面弹出提示框(一) TextView实现,带动画效果

    产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...

随机推荐

  1. django 笔记17 ModelForm

    Model 数据库操作 验证 验证 Form -class LoginForm(Form): email = fields.EmailField() is_valid 每一个字段进行正则(字段内置正则 ...

  2. 使用sshfs来挂载远程的文件

    只要安装sshfs就可以通过ssh的端口来远程挂载文件夹, 不需要其他额外的配置非常的方便. 这个软件在只有ssh权限的情况下远程范围文件是非常有用的.   1. 安装sshfs 2. 用法非常简单 ...

  3. JQ加载进度条动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 《剑指offer》二进制中1的个数

    一.题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 二.牛客网提供的框架 class Solution { public: int NumberOf1(int n) { } ...

  5. Unix版权史

    原文出处: 阮一峰    这几天,我在读<Unix编程艺术>. 书中介绍了Unix的发展历史.我发现,这是一个很好的例子,说明现行版权制度具有阻碍社会发展的负面作用. 2. Unix诞生于 ...

  6. [USACO08DEC]拍头Patting Heads 水题

    类似素数筛,暴力可过,不需要太多的优化 Code: #include<cstdio> #include<algorithm> #include<string> us ...

  7. 【习题 8-17 UVA - 11536】Smallest Sub-Array

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 考虑一个1..i的窗口. 里面在到达了i位置的时候恰好有1..k这些数字了. 为了更接近答案. 显然可以试着让左端点变成2 ...

  8. FastDFS学习总结(1)--FastDFS安装和部署

    FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站 Fast ...

  9. 浴谷 P1768 天路

    P1768 天路 题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于 ...

  10. cxf 实例解读

    1.sample 实例之一---java_first_pojo 服务端发布服务的方法: 1 HelloWorldImpl helloworldImpl = new HelloWorldImpl(); ...