android popupWindow伪菜单背景半透明以及触摸事件的相关问题

梅明子 2015-03-11 03:11:45
先看两个截图:



点击menu键就显示底部的伪菜单,同时加了popupWindow.setOnDismissListener(new poponDismissListener());监听,显示的时候就把窗体变为半透明,关闭就还原窗体状态。
我想要的功能:当显示伪菜单的时候,除了伪菜单区域可以操作,其区域外面(也就是半透明部分)就不可以操作,只有当关闭伪菜单的时候,才可以操作半透明区域。
现在我已经实现了的有:
1,显示伪菜单,并且背景透明。
2,显示的时候,只有伪菜单区域可操作,半透明区域不可操作。

问题:伪菜单显示的时候,按back键以及再次点击menu键,按常理伪菜单就会被dismiss()掉。可以我发现,点击这两个按钮没反应,伪菜单始终不会被dismiss()掉。请问这是为什么?求大神们指点!
...全文
2016 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuh6 2015-03-12
  • 打赏
  • 举报
回复
引用 6 楼 baidu_23478311 的回复:
[quote=引用 5 楼 liuh6 的回复:] 在onkeydown 或onkeyup事件的返回按键中加入隐藏的代码 if(popupWindow!=null&& popupWindow.isShow()){ popupWindow.dissmiss(); }
已经搞定了! View view = (LinearLayout)getLayoutInflater().inflate(R.layout.activity_menu_prop, null);在这个xml布局里最外层(我这里是LinearLayout)加上如下代码:

//下面部分代码主要用于响应按键事件(menu、back)
		LinearLayout layout = (LinearLayout)view.findViewById(R.id.menu_layout);
		layout.setFocusableInTouchMode(true);//能够获得焦点
		layout.setOnKeyListener(new OnKeyListener() {
			
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch(keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                    	closePopupWindow();
                        break;
                    case KeyEvent.KEYCODE_MENU:
                    	closePopupWindow();
                        break;
                    }
                }
                return true;
			}
		});
就OK了!非常完美! 完整代码如下:

	/**menu菜单选项*/
	private void showPopupWindow() {
		View view = (LinearLayout)getLayoutInflater()
				.inflate(R.layout.activity_menu_prop, null);
		LinearLayout scanmusic = (LinearLayout)view
				.findViewById(R.id.menu_scanmusic);
		LinearLayout equalizer = (LinearLayout)view
				.findViewById(R.id.menu_equalizer);
		LinearLayout sleep = (LinearLayout)view
				.findViewById(R.id.menu_sleep);
		LinearLayout preferences = (LinearLayout)view
				.findViewById(R.id.menu_preferences);
		LinearLayout exit = (LinearLayout)view
				.findViewById(R.id.menu_exit);
		LinearLayout menu_null = (LinearLayout)view
				.findViewById(R.id.menu_null);
		//设置选项size
		int newW = dm_width-Utils.dip2px(this, 0.5f);
		LinearLayout.LayoutParams param = 
				new LinearLayout.LayoutParams(newW/3, (newW/3)/3*2);
		scanmusic.setLayoutParams(param);
		equalizer.setLayoutParams(param);
		sleep.setLayoutParams(param); 
		preferences.setLayoutParams(param);
		exit.setLayoutParams(param);
		menu_null.setLayoutParams(param);
		
		scanmusic.setOnClickListener(new myOnClickListener());
		equalizer.setOnClickListener(new myOnClickListener());
		sleep.setOnClickListener(new myOnClickListener());
		preferences.setOnClickListener(new myOnClickListener());
		exit.setOnClickListener(new myOnClickListener());
		popupWindow = new PopupWindow(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
		popupWindow.setContentView(view);
		popupWindow.setFocusable(true); //设置PopupWindow可获得焦点(设置setFocusable属性,会无法响应按键事件,因此在下面加上setOnKeyListener)
		popupWindow.setTouchable(true); //设置PopupWindow可触摸
		popupWindow.setOutsideTouchable(false); //设置非PopupWindow区域是否可触摸
		backgroundAlpha(0.4f);
		//添加pop窗口关闭事件
		popupWindow.setOnDismissListener(new poponDismissListener());
		popupWindow.setAnimationStyle(R.style.popuStyle); //设置 popupWindow动画样式
		popupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.BOTTOM, 0, 0);
		//下面部分代码主要用于响应按键事件(menu、back)
		LinearLayout layout = (LinearLayout)view.findViewById(R.id.menu_layout);
		layout.setFocusableInTouchMode(true);//能够获得焦点
		layout.setOnKeyListener(new OnKeyListener() {
			
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch(keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                    	closePopupWindow();
                        break;
                    case KeyEvent.KEYCODE_MENU:
                    	closePopupWindow();
                        break;
                    }
                }
                return true;
			}
		});
	}

	/**关闭popupWindow*/
	private void closePopupWindow(){
		if (popupWindow!=null) {
			popupWindow.dismiss();
			popupWindow=null;
		}
	}
[/quote] 解决了就好,祝好运!
梅明子 2015-03-12
  • 打赏
  • 举报
回复
引用 7 楼 Evankaka 的回复:
我还想说用ActionBar呢。。楼主就解决了
呵呵,现在又有一个新的问题在困扰我
Evankaka 2015-03-11
  • 打赏
  • 举报
回复
我还想说用ActionBar呢。。楼主就解决了
梅明子 2015-03-11
  • 打赏
  • 举报
回复
引用 5 楼 liuh6 的回复:
在onkeydown 或onkeyup事件的返回按键中加入隐藏的代码 if(popupWindow!=null&& popupWindow.isShow()){ popupWindow.dissmiss(); }
已经搞定了! View view = (LinearLayout)getLayoutInflater().inflate(R.layout.activity_menu_prop, null);在这个xml布局里最外层(我这里是LinearLayout)加上如下代码:

//下面部分代码主要用于响应按键事件(menu、back)
		LinearLayout layout = (LinearLayout)view.findViewById(R.id.menu_layout);
		layout.setFocusableInTouchMode(true);//能够获得焦点
		layout.setOnKeyListener(new OnKeyListener() {
			
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch(keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                    	closePopupWindow();
                        break;
                    case KeyEvent.KEYCODE_MENU:
                    	closePopupWindow();
                        break;
                    }
                }
                return true;
			}
		});
就OK了!非常完美! 完整代码如下:

	/**menu菜单选项*/
	private void showPopupWindow() {
		View view = (LinearLayout)getLayoutInflater()
				.inflate(R.layout.activity_menu_prop, null);
		LinearLayout scanmusic = (LinearLayout)view
				.findViewById(R.id.menu_scanmusic);
		LinearLayout equalizer = (LinearLayout)view
				.findViewById(R.id.menu_equalizer);
		LinearLayout sleep = (LinearLayout)view
				.findViewById(R.id.menu_sleep);
		LinearLayout preferences = (LinearLayout)view
				.findViewById(R.id.menu_preferences);
		LinearLayout exit = (LinearLayout)view
				.findViewById(R.id.menu_exit);
		LinearLayout menu_null = (LinearLayout)view
				.findViewById(R.id.menu_null);
		//设置选项size
		int newW = dm_width-Utils.dip2px(this, 0.5f);
		LinearLayout.LayoutParams param = 
				new LinearLayout.LayoutParams(newW/3, (newW/3)/3*2);
		scanmusic.setLayoutParams(param);
		equalizer.setLayoutParams(param);
		sleep.setLayoutParams(param); 
		preferences.setLayoutParams(param);
		exit.setLayoutParams(param);
		menu_null.setLayoutParams(param);
		
		scanmusic.setOnClickListener(new myOnClickListener());
		equalizer.setOnClickListener(new myOnClickListener());
		sleep.setOnClickListener(new myOnClickListener());
		preferences.setOnClickListener(new myOnClickListener());
		exit.setOnClickListener(new myOnClickListener());
		popupWindow = new PopupWindow(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
		popupWindow.setContentView(view);
		popupWindow.setFocusable(true); //设置PopupWindow可获得焦点(设置setFocusable属性,会无法响应按键事件,因此在下面加上setOnKeyListener)
		popupWindow.setTouchable(true); //设置PopupWindow可触摸
		popupWindow.setOutsideTouchable(false); //设置非PopupWindow区域是否可触摸
		backgroundAlpha(0.4f);
		//添加pop窗口关闭事件
		popupWindow.setOnDismissListener(new poponDismissListener());
		popupWindow.setAnimationStyle(R.style.popuStyle); //设置 popupWindow动画样式
		popupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.BOTTOM, 0, 0);
		//下面部分代码主要用于响应按键事件(menu、back)
		LinearLayout layout = (LinearLayout)view.findViewById(R.id.menu_layout);
		layout.setFocusableInTouchMode(true);//能够获得焦点
		layout.setOnKeyListener(new OnKeyListener() {
			
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch(keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                    	closePopupWindow();
                        break;
                    case KeyEvent.KEYCODE_MENU:
                    	closePopupWindow();
                        break;
                    }
                }
                return true;
			}
		});
	}

	/**关闭popupWindow*/
	private void closePopupWindow(){
		if (popupWindow!=null) {
			popupWindow.dismiss();
			popupWindow=null;
		}
	}
liuh6 2015-03-11
  • 打赏
  • 举报
回复
在onkeydown 或onkeyup事件的返回按键中加入隐藏的代码 if(popupWindow!=null&& popupWindow.isShow()){ popupWindow.dissmiss(); }
梅明子 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 u011489615 的回复:
为什么用 popwindow ? 不是有原生的menu吗?
除非系统2点几的就可以。
梅明子 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 u011489615 的回复:
为什么用 popwindow ? 不是有原生的menu吗?
原生的menu菜单都是一字竖着在底部中间排列的!
马甲大王 2015-03-11
  • 打赏
  • 举报
回复
为什么用 popwindow ? 不是有原生的menu吗?
梅明子 2015-03-11
  • 打赏
  • 举报
回复
我先贴上源码

	/**menu菜单选项*/
	private void showPopupWindow() {
		View view = (LinearLayout)getLayoutInflater()
				.inflate(R.layout.activity_menu_prop, null);
		LinearLayout scanmusic = (LinearLayout)view
				.findViewById(R.id.menu_scanmusic);
		LinearLayout equalizer = (LinearLayout)view
				.findViewById(R.id.menu_equalizer);
		LinearLayout sleep = (LinearLayout)view
				.findViewById(R.id.menu_sleep);
		LinearLayout preferences = (LinearLayout)view
				.findViewById(R.id.menu_preferences);
		LinearLayout exit = (LinearLayout)view
				.findViewById(R.id.menu_exit);
		LinearLayout menu_null = (LinearLayout)view
				.findViewById(R.id.menu_null);
		//设置选项size
		int newW = dm_width-Utils.dip2px(this, 0.5f);
		LinearLayout.LayoutParams param = 
				new LinearLayout.LayoutParams(newW/3, (newW/3)/3*2);
		scanmusic.setLayoutParams(param);
		equalizer.setLayoutParams(param);
		sleep.setLayoutParams(param); 
		preferences.setLayoutParams(param);
		exit.setLayoutParams(param);
		menu_null.setLayoutParams(param);
		
		scanmusic.setOnClickListener(new myOnClickListener());
		equalizer.setOnClickListener(new myOnClickListener());
		sleep.setOnClickListener(new myOnClickListener());
		preferences.setOnClickListener(new myOnClickListener());
		exit.setOnClickListener(new myOnClickListener());
		popupWindow = new PopupWindow(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
		popupWindow.setFocusable(true); //设置PopupWindow可获得焦点  
		popupWindow.setTouchable(true); //设置PopupWindow可触摸
		popupWindow.setOutsideTouchable(false); //设置非PopupWindow区域是否可触摸
		
		popupWindow.setContentView(view);
		backgroundAlpha(0.5f);
		//添加pop窗口关闭事件  
		popupWindow.setOnDismissListener(new poponDismissListener());
		popupWindow.setAnimationStyle(R.style.popuStyle); //设置 popupWindow动画样式
		popupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.BOTTOM, 0, 0);
	}

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧