如何让AlertDialog 在点击确定或者取消时不消失

       有时候我们会在AlertDialog 里面进行一些逻辑判断,当单击“确定“按钮时完成某些工作,如果这些工作失败,对话框不能关闭。而当成功完成工作后,则关闭对话框。但是系统默认是每次点击确定按钮或者取消按钮,dialog都会消失。原因分析的话这篇文章分析的非常好,我就不再累赘:http://blog.youkuaiyun.com/jdsjlzx/article/details/25288749,它里面也提供了些解决办法,比如利用反射或者自定义handler,但是感觉有点烦,于是我在stackoverflow上找到了一个更好的方法:

 final AlertDialog mDialog=new AlertDialog.Builder(this).setPositiveButton("确定", null).setNegativeButton("取消", null).create();
        mDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                Button positionButton=mDialog.getButton(AlertDialog.BUTTON_POSITIVE);
                Button negativeButton=mDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
                positionButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"确定",Toast.LENGTH_SHORT).show();
                        mDialog.dismiss();
                    }
                });
                negativeButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"取消",Toast.LENGTH_SHORT).show();

                    }
                });
            }
        });

        mDialog.show();
嗯,这样子就可以自己控制dialog的显示和消失了,so easy。以上代码实现的是点击确定,dialog消失,点击取消,dialog不消失。

<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]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值