您的位置:首页 > 移动开发 > Android开发

Android的dialog控制焦点导致其后Activity不响应

2015-01-09 19:05 393 查看
一、在如下处添加打印可以确认当前焦点位置

frameworks/base/core/java/android/view/ViewGroup.java //分发给View的关键部分!!!

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onKeyEvent(event, 1);
        }

        if ((mPrivateFlags & (PFLAG_FOCUSED | PFLAG_HAS_BOUNDS))
                == (PFLAG_FOCUSED | PFLAG_HAS_BOUNDS)) {
            Log.d("TKTK","TK------ViewGroup,java--->>>>>>nofacus");//add by tank
            if (super.dispatchKeyEvent(event)) {
                return true;
            }
        } else if (mFocused != null && (mFocused.mPrivateFlags & PFLAG_HAS_BOUNDS)
                == PFLAG_HAS_BOUNDS) {
            Log.d("TKTK","TK------ViewGroup,java--->>>>>>mFocused is " + mFocused);//add by tank
            if (mFocused.dispatchKeyEvent(event)) {
                return true;
            }
        }

        if (mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onUnhandledEvent(event, 1);
        }
        return false;
    }


二、修改方法

public MenuDialog(Context context, int theme) {
  super(context, theme);
  WindowManager.LayoutParams lp =  new LayoutParams(  
	                LayoutParams.WRAP_CONTENT| LayoutParams.TYPE_SYSTEM_ERROR|   
	                LayoutParams.FLAG_NOT_FOCUSABLE| PixelFormat.TRANSPARENT);   
  lp.type = WindowManager.LayoutParams.TYPE_TOAST;
  //WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE是关键!!!!!
  lp.flags =  WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE ; 
  lp.gravity = Gravity.RIGHT;
  lp.alpha=1f;
  lp.x = -200;
  lp.width = 0;
  lp.height = 0;
  lp.dimAmount = 1.0f;   
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setAttributes(lp);
  Window window = this.getWindow(); 
  window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);  
  window.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
  this.setContentView(R.layout.main); 
  Utils.logger("Dialog初始完成"); 
}
三、简单说明

dialog启动时默认会最高优先级获取焦点;并且只有当其退出时,才会释放。

我们的需求:

dialog不响应按键;通过广播响应。其后是TV的Activity,按键由TV的Activity响应。

问题:

dialog拦截了我们TV的Activity需要的响应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: