android复写监控事件,android关于重写popwindow,back事件的监听

  • Post author:
  • Post category:其他


第一:问题:

PopupWindow弹出窗口之后,想在back键的时候自己做其他的事情,如何获取back键。

第二:解决:

keyboardView.setFocusable(true);//comment by danielinbiti,设置view能够接听事件,标注1

keyboardView.setFocusableInTouchMode(true); //comment by danielinbiti,设置view能够接听事件 标注2

keyboardView.setOnKeyListener(new OnKeyListener(){

@Override

public boolean onKey(View arg0, int arg1, KeyEvent arg2) {

if (arg1 == KeyEvent.KEYCODE_BACK){

if(popupWindow != null) {

close();

}

}

return false;

}

});

第三:尝试与结论:

其实这段代码在网上很容易看到,但是关键是红色字体部分的理解。因为我们都是需要自定义popWindwow。

1)你首先想到的肯定是一般的activity的back事件处理。

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_HOME) {

super.onKeyDown(keyCode, event);

returntrue;

}else if(keyCode ==KeyEvent.KEYCODE_BACK)

{

super.onKeyDown(keyCode, event);

if(pop1!=null)

{

pop1.myFinish();

}

returntrue;

}else

{

returnsuper.onKeyDown(keyCode,event);

}

}

但是,这样是不可以的,因为你自己定义的popwindow只是悬浮在这个activity上边,如果你将这个方法写在弹出pop的activity中,你点击back,系统处理的不是你期望在popWindow的时候你点击back要做的处理效果。

2)所以,你又会想让自己的自定义popwindow继承自activity类,然后在类里边重写这个back事件,其实这样还是不合理的。因为系统根本没有调用到。(你可以测试看下效果)

3)然后,你想着让自己的自定义的popwindow继承自popupWindow,这样,你重写系统的dismiss方法,等系统调用的时候,就可以执行到你的方法了,其实这样也是不可以的。因为这个是你自定义的,你自己不调用,系统是不会调用的。

4)那问题出来了,网上给的答案,就是设置view能够监听事件,自己要怎么处理。

其实很简单。

public class PopWindow extends BaseActivity{

private ViewGroup myView;private PopupWindow popupWindow;private Context ctx;private Activity ac;ListView view;

private Button cancle;

public PopWindow(Context context,Activity activity) {

super();

ctx=context;

ac=activity;

// TODO Auto-generated constructor stub

}

public void PopWindowLogin()

{

myView= (ViewGroup)ac.getLayoutInflater().inflate(R.layout.myui_pop_login_view, null);

cancle=(Button)myView.findViewById(R.id.pop_login_cancle);

cancle.setText(R.string.myui_pop_cancel);

cancle.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

ComConstants.cancleFlag=true;

popupWindow.dismiss();

}

});

commSettingPopWindow();

}

public void commSettingPopWindow()

{

popupWindow = new PopupWindow(myView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, true);

popupWindow.setBackgroundDrawable(new BitmapDrawable());

popupWindow.showAtLocation(myView, Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 20, 20);

}

public void dismiss()

{

if(popupWindow!=null)

{

popupWindow.dismiss();

}

}

}

好了,问题解决。