使用WindowManager addView来显示一个窗口,响应返回按钮小技巧

来源:互联网 发布:2004全明星新秀赛数据 编辑:程序博客网 时间:2024/04/28 13:07

         今天在做公司的广告sdk的启动页广告的时候,使用windowmanager来显示一个view在最上层,之前都是定时消失的,后来无意中发现按返回按钮都没有消失,于是开始找解决方法。

          首先想起心里天气通有类试的功能,于是反编译看其代码,里面实现的方式是 setOnKeyListener()把自己的监听器传递进去来处理,这个方法也是最容易想到的,其是可以解决部分情况,如当addview中的view是view的直接子类的时候,都没有问题,若自定义的view或者textview之类的,但是加入放入的是viewgroup的子类(我放入的是自定义的viewgroup)就没有响应到。

         其次,解决问题是思路是:我们开发的时候要经常对touch event进行拦截,所以我们也容易联系到android中惯用的方式,那就是先dispach再on开头的生命周期方法,如dispachDraw()  --> onDraw();所以key event也应该会有一样的方法,所以就要重写dispatchKeyEvent()对back按键拦截处理,然后在重写setOnKeyListener拿到我们设的onKeyLIstener,这样就可以解决上面提到的viewgroup无法实现的功能(该思路针对的是初学者,对android还不熟悉的朋友提供的,若是经验多一点的开发者不想也都知道的了)

  最后代码是:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// TODO Auto-generated method stub
Log.d(TAG, "dispatchKeyEvent " + event.getKeyCode());
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (mOnKeyListener != null) {
mOnKeyListener.onKey(this, KeyEvent.KEYCODE_BACK, event);
return true;
}
}
return super.dispatchKeyEvent(event);
}


OnKeyListener mOnKeyListener = null;


@Override
public void setOnKeyListener(OnKeyListener l) {
// TODO Auto-generated method stub
this.mOnKeyListener = l;
}

原创粉丝点击