Android下关于AlertDialog点击 确定或者取消按钮 对话框自动消失的 解决办法

本文主要介绍了在Android中遇到AlertDialog点击确定或取消按钮后对话框自动消失的问题,并提供了详细的代码解决方案,附带详细注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接看代码,注释详细



package com.dialog.oo;

import java.lang.reflect.Field;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * 主类, 本文主要说明一个问题,对话框的 按钮点击事件
 * 
 * 测试环境:android 2.3.3 
 * 
 * @author hsx
 * @time 2013-4-19上午10:34:25
 */
public class Main extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		/**
		 * 关于 这 几个方法的 写法 说明一下: 以前 我喜欢将所有的控件定义成全局变量, 然后
		 * 控件的发现放在一个叫initWidget()这样的方法 里面, 然后 控件的操作 放在一个 叫 initWidgetHandler()
		 * 这样的 方法里面(这2个方法的名字是我自己命名的) 但是现在 我更偏向于
		 * 将某个控件的发现和操作放在同一个方法里面,然后在相应的方法里面调用。 两者的各有好处,我先前的做法适用于 这个控件 关联的东西
		 * 很多,定义成全局的 容易获取到, 而且一次 发现(ps:我所谓的发现 是指
		 * 调用findViewByid()这个方法)之后,后面无需再发现, 因为
		 * 发现一次控件,就要遍历一次树,很耗时的操作,所以当控件时常用的时候或者关联的地方很多时,定义成全局的很好。 但是 当某个 控件与
		 * 其他逻辑关联度很低时,完全可以将控件的发现和操作放在一起,显得更加清晰明了,模块化的更好,更加易于阅读。
		 * 
		 */
		initBtnOne();
		initBtnTwo();
		initBtnThree();
	}


	/**
	 * 第3个按钮 的 操作
	 * 
	 * @return void
	 * @author hsx
	 * @time 2013-4-19上午10:32:04
	 */
	private void initBtnThree() {
		//第3个对话框 的结论: 可以通过 如下的方法 修改系统的 机制,使其当 点击 AlertDialog对话框中
		//的按钮时,对话框不消失
		Button btnThree = (Button) findViewById(R.id.btn_three);
		btnThree.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				dialogThree();
			}

		});
	}

	/**
	 * 第2个按钮 的 操作
	 * 
	 * @return void
	 * @author hsx
	 * @time 2013-4-19上午10:32:04
	 */
	private void initBtnTwo() {
		// 第2个对话框的结论是: 直接放2个按钮到AlertDialog上面,即使2个按钮直接return
		// 点击任何一个之后,对话框同样会消失。 由1,2 两个对话框可以看出,AlertDialog的按钮点击操作,系统会自动
		// 控制dialog消失
		Button btnTwo = (Button) findViewById(R.id.btn_two);
		btnTwo.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				dialogTwo();
			}
		});
	}

	/**
	 * 第1个按钮 的 操作
	 * 
	 * @return void
	 * @author hsx
	 * @time 2013-4-19上午10:32:04
	 */
	private void initBtnOne() {
		// 第1个对话框的结论是: 直接放2个按钮到AlertDialog上面,即使2个按钮不进行任何操作
		// 点击任何一个之后,对话框同样会消失。
		Button btnOne = (Button) findViewById(R.id.btn_one);
		btnOne.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				dialogOne();
			}
		});
	}

	/**
	 * 第一个对话框
	 * 
	 * @return void
	 * @author hsx
	 * @time 2013-4-19上午10:54:13
	 */
	private void dialogOne() {
		AlertDialog.Builder builder = new Builder(this);
		builder.setTitle("我是第一个对话框");
		builder.setMessage("请直接点个按钮,按钮中没有做任何操作");
		builder.setPositiveButton("确定", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		});
		builder.setNegativeButton("取消", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		});
		builder.show();

	}

	/**
	 * 第二个对话框
	 * 
	 * @return void
	 * @author hsx
	 * @time 2013-4-19上午11:01:24
	 */
	private void dialogTwo() {
		AlertDialog.Builder builder = new Builder(this);
		builder.setTitle("我是第二个对话框");
		builder.setMessage("请直接点个按钮,按钮中直接做return操作");
		builder.setPositiveButton("确定", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		builder.setNegativeButton("取消", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		builder.show();
	}

	/**
	 * 第三个 对话框
	 * 
	 * @return void
	 * @author hsx
	 * @time 2013-4-19上午11:12:58
	 */
	private void dialogThree() {
		AlertDialog.Builder builder = new Builder(this);
		builder.setTitle("我是第三个对话框");
		builder.setMessage("请直接点个按钮,按钮中做相应操作,点击确定不会消失,点击取消消失");
		builder.setPositiveButton("确定", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//点击确定不消失。
				try {
					Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing" );
					field.setAccessible( true );
					//   将mShowing变量设为false,表示对话框已关闭 
					field.set(dialog, false );
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (NoSuchFieldException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				dialog.dismiss();

			}
		});
		builder.setNegativeButton("取消", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//点击取消 则消失。
				try {
					Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing" );
					field.setAccessible( true );
					//   将mShowing变量设为true,表示对话框未关闭
					field.set(dialog, true );
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (NoSuchFieldException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
				
			}
		});
		builder.show();



	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值