You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用进度条运行时的屏幕触摸?getWindow()代码无效求助

解决进度条显示时触摸功能无法禁用的问题

哥们我太懂你这困扰了——想在显示进度对话框的时候锁住屏幕触摸,结果用getWindow()设置FLAG_NOT_TOUCHABLE完全没效果对吧?我之前做项目也踩过这个坑,给你几个亲测有效的解决思路:

核心问题分析

你当前调用的getWindow()是宿主Activity的Window对象,但进度Dialog本身是一个独立的弹窗Window,它的触摸事件优先级比Activity的Window更高。所以你设置Activity的Window禁止触摸,用户还是能点击到Dialog的区域,自然看起来没生效。

解决方案1:给Dialog的Window设置触摸禁用

直接操作Dialog自己的Window来设置flags,这才是精准生效的关键:

@Override 
protected void onPreExecute() { 
    dialog.setMessage("Doing something, please wait."); 
    dialog.show(); 
    // 获取Dialog的Window对象并设置触摸禁用flag
    Window dialogWindow = dialog.getWindow();
    if (dialogWindow != null) {
        dialogWindow.setFlags(
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
        );
    }
}

别忘了在任务完成后恢复触摸功能(如果需要的话),比如在onPostExecute里:

@Override
protected void onPostExecute(Void result) {
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
        // 恢复Activity的触摸能力(如果之前给Activity设置过flag的话)
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    }
}

解决方案2:结合setCancelable(false)双重保险

如果你的Dialog允许点击外部关闭,那即使设置了触摸flag,用户还是能通过点击外部取消Dialog。可以加上这行代码彻底锁住:

// 在初始化Dialog的时候设置
dialog.setCancelable(false);

这会禁止用户通过点击Dialog外部或者返回键来关闭它,配合上面的Window flag,就能实现完全的触摸锁定效果。

额外注意点

如果你的代码是在Fragment中调用的,要确保getWindow()拿到的是宿主Activity的Window,或者直接用Dialog的Window(更推荐),避免上下文错误导致flag不生效。

内容的提问来源于stack exchange,提问作者Pawan Kumar singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:26:49