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

在Android中,当使用PopupWindow时,想要在按下Back键时执行特定操作,而非系统默认行为。本文探讨了四种尝试方法,包括直接在Activity中处理、使PopupWindow继承自Activity、使PopupWindow继承自PopupWindow并重写dismiss方法,以及最终解决方案——通过设置View监听事件来捕获Back键并自定义处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一:问题:

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();
		}
	}
}


好了,问题解决。

参考:http://www.sctarena.com/Article/Article.asp?nid=4783


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值