第一:问题:
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();
}
}
}
好了,问题解决。