系统AlertDialog的点击确定dialog不消失

本文介绍了在Android中使用AlertDialog时遇到的问题,即点击确定按钮后对话框无法正常关闭。文章详细讲解了如何创建一个ButtonHandler来实现点击确定按钮时进行条件判断,只有满足特定条件时才关闭对话框,否则保持对话框显示。

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

我们会用到android自带的alertDialog,非常简单,但是,弄完之后会发现,点击确定和取消,都对dialog进行了dismiss。

我们有时候需要对dialog点击确定进行判断,满足条件取消,不满足条件则不进行取消。

实现如下,新建一个ButtonHandler:

import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;

import java.lang.ref.WeakReference;

/**
 * Created by Administrator on 2016/9/27 0027.
 */
public class ButtonHandler extends Handler {

    private WeakReference<DialogInterface> mDialog;

    public ButtonHandler(DialogInterface dialog) {
        mDialog = 
<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]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值