为什么我的页面在PhoneWindow的dispactKeyEvent拦不了

问题

我在PhoneWindow.java的dispatchKeyEvent里面搞了个配置,企图通过这个配置实时控制硬按键是否可用。
在普通的activity页面里确实是达到了我要的效果。开心;-)。
但是。。
我后面又搞了个页面用WindowManager.addView方式覆盖上来的。
mWindowManager.addView(mView, mLayoutParams);
还是老规矩,设置了配置不可用。结果按了音量键,听到了脆耳的来电铃声,崩溃了。

原因

我们用Android studio 抓一下layout inspection
这个是普通activity的view tree

image.png

可以看到他的树根是phoneWindow的DecorView,后面才是我们自己在setContentView里传入的layout。
而用WindowManager.addView的view tree呢,
image.png

根布局直接是addView的view。
所以这也是为什么在 PhoneWindow不能拦截按键事件的原因。
对于想深入了解PhoneWindow的可以看下这个。https://www.jianshu.com/p/e42b638944ae

解决

这条路走不通了,那怎么解决呢?
自定义view,在dispatchKeyEvent里返回true表示当前view能处理该点击事件,不需要派发到子view。

public class InterceptedKeyLinearLayout extends LinearLayout {
    private static final String TAG =  InterceptedKeyLinearLayout.class.getSimpleName();
    public InterceptedKeyLinearLayout(Context context) {
        super(context);
    }

    public InterceptedKeyLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        Log.d(TAG, "dispatchKeyEvent: prevent the key in this page "+event.toString());
        return true;
    }
}```


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在Android中所有的视图都是通过Window来呈现的,Window是View的直接管理者,每一个Activit...
    曾想念_fce1阅读 1,011评论 0 2
  • 文章独家授权公众号:码个蛋更多分享:http://www.cherylgood.cn 前言 hello,大家好,平...
    Angels_安杰阅读 1,085评论 0 4
  • 起因 昨天被人问起Activity的启动过程,我一阵心虚,说实话,N年前看过一回别人写的文章,但是自己从来没有跟着...
    贾亦真亦贾阅读 1,332评论 2 2
  • 事件分为按键事件分发,触摸事件分发,还有轨迹球事件,轨迹球已经被淘汰,按键事件分发主要是在TV上,使用遥控器做按键...
    博为峰51Code教研组阅读 1,069评论 0 0
  • 你总是写寒鸦 其实你并没有见过它 你总是写夜晚 其实你很少穿越它 你也写落叶 写大雨 写雪花 其实你也只是踩踏或者...
    韩大散人阅读 241评论 0 0