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


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

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

    例如以下图:


    按下Menu键则在弹出消息,

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

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

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

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

    1、首先是在resvaluesstrings.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操作设备的通知栏》(点击打开链接),在reslayoutactivity_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);
    	}
    }
    


  • 相关阅读:
    SQL Server TSQL高级查询
    ado.net
    Apache配置详解(最好的APACHE配置教程)
    CrystalReport for vs2010 水晶报表的发布问题以及捆绑发布
    Rails 疑难解决
    [转]if 命令示例详解
    How To Deploy on Bluehost
    CustomActionData 属性 [Visual Studio 中的部署]
    BlueHost下部署rails app经验
    Using Ruby On Rails on Bluehost
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7002112.html
Copyright © 2020-2023  润新知