如何禁用进度条运行时的屏幕触摸?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
相关产品推荐
相关产品推荐

