Android让AlertDialog点击确定不会消失

本文介绍了一种在Android开发中使用AlertDialog时不让对话框关闭的方法,通过反射技术修改内部状态来实现点击确认按钮后对话框保持打开状态的效果。

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

在Android的alertDialog中,使用自带的button,点击确定或者取消,都会关闭对话框。但我们有时候希望比如点击确定的时候发现他有没填的选项,我们提示他填写完整,这个时候不关闭对话框。当然解决办法,有很多。比如用个activity做dialog。或者自定义view.使用自己定义的button.不使用自带的button.但是有时候我们的dialog的view很简单,这个时候我们继续使用自带的button.这个时候该怎么办呢。可以利用的java的反射技术。在需要不关闭的按钮地方:

try 
				{
					Field field = dialog.getClass()
					.getSuperclass().getDeclaredField(
					"mShowing" );
					field.setAccessible( true );
					// 将mShowing变量设为false,表示对话框已关闭 
					field.set(dialog, false );
					dialog.dismiss();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}

在需要关闭的地方:

try 
				{
					Field field = dialog.getClass()
					.getSuperclass().getDeclaredField(
					"mShowing" );
					field.setAccessible( true );
					// 将mShowing变量设为false,表示对话框已关闭 
					field.set(dialog, true );
					dialog.dismiss();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}

这里的Field所在包是java.lang.reflect.Field

具体的详情可参考这篇文章:  http://blog.youkuaiyun.com/notonlyforshe/article/details/7955323

<think>好的,用户想修改Android AlertDialog的显示位置并禁用点击外部消失的功能。我需要先理清这两个需求的具体实现方法。首先,关于调整显示位置,我记得AlertDialog的Window对象可以设置位置参数。可能需要获取Window的Attributes,调整y轴的值,或者设置Gravity来改变位置。例如,设置Gravity为TOP可以让对话框出现在顶部,然后通过y轴偏移微调位置。 接下来是禁用点击外部取消。根据引用[2]中的信息,可以通过setCancelable(false)和setCanceledOnTouchOutside(false)来实现。不过用户可能是在DialogFragment中使用,所以需要在创建AlertDialog的时候设置这些属性,或者在DialogFragment的onStart方法中获取对话框并设置。 然后,用户提到要上移位置。可能需要先获取AlertDialog的Window对象,然后调整它的属性。比如,设置Gravity为TOP,然后设置y轴的偏移量。例如: Window window = alertDialog.getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.gravity = Gravity.TOP; params.y = 100; // 单位是像素,可能需要转换为dp window.setAttributes(params); 但要注意,这里可能需要处理不同屏幕密度的转换,或者使用dimen资源来设置合适的值。 另外,关于代码的正确性,确保在对话框显示之后才能获取Window对象,否则可能会空指针。所以最好在调用show()之后再进行这些设置,或者在创建对话框后立即获取Window对象。 还有,用户可能是在DialogFragment中使用,所以需要覆盖onCreateDialog方法,并在其中设置这些属性。例如: @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog dialog = new AlertDialog.Builder(getActivity()) // 其他设置 .create(); dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(false); return dialog; } 然后,在onStart方法中调整位置: @Override public void onStart() { super.onStart(); Window window = getDialog().getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.gravity = Gravity.TOP; params.y = getResources().getDimensionPixelSize(R.dimen.dialog_offset); window.setAttributes(params); } 这样应该能同时满足位置调整和禁用外部点击取消的需求。最后,需要提醒用户注意代码中的单位转换,避免在不同设备上显示不一致。同时,测试不同Android版本是否有兼容性问题,比如某些旧版本可能需要不同的处理方式。</think>要修改Android AlertDialog的显示位置并禁用点击外部消失的功能,可以通过以下步骤实现: ### 1. 禁用点击外部取消 在创建AlertDialog时添加以下代码: ```java AlertDialog dialog = new AlertDialog.Builder(context) .setTitle("标题") .setMessage("内容") .setCancelable(false) // 禁用返回键取消 .create(); dialog.setCanceledOnTouchOutside(false); // 禁用点击外部取消[^2] ``` ### 2. 调整对话框显示位置 通过Window参数修改对话框位置: ```java dialog.show(); // 必须先显示才能获取Window对象 Window window = dialog.getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); params.gravity = Gravity.TOP; // 设置顶部对齐 params.y = 200; // 单位像素,建议使用dp转换 window.setAttributes(params); } ``` ### 完整示例(DialogFragment实现) ```java public class CustomDialog extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog dialog = new AlertDialog.Builder(getActivity()) .setTitle("自定义位置对话框") .setMessage("已禁用外部点击关闭") .setPositiveButton("确定", null) .setCancelable(false) .create(); dialog.setCanceledOnTouchOutside(false); return dialog; } @Override public void onStart() { super.onStart(); Window window = getDialog().getWindow(); if (window != null) { WindowManager.LayoutParams params = window.getAttributes(); params.gravity = Gravity.TOP; // 转换dp为像素(示例设置100dp偏移量) params.y = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics() ); window.setAttributes(params); } } } ``` ### 注意事项 - `params.y`的偏移量需要根据实际布局需求调整 - 建议使用`TypedValue.applyDimension()`进行dp到像素的转换 - 对话框内容较多时可能需要同时调整宽度参数[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值