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

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



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

问题:伪菜单显示的时候,按back键以及再次点击menu键,按常理伪菜单就会被dismiss()掉。可以我发现,点击这两个按钮没反应,伪菜单始终不会被dismiss()掉。请问这是为什么?求大神们指点!
...全文
2091 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);
	}
内容概要:本文围绕“新能源发电接入弱电网的宽频带振荡机理及抑制方法”开展深入研究,结合Matlab编程与Simulink仿真平台,系统剖析新能源发电系统在弱电网条件下引发的宽频带振荡问题。研究聚焦于变流器控制动态、锁相环(PLL)频率耦合效应、序阻抗建模及其交互特性等关键因素,揭示振荡产生的内在机理。通过构建精确的数学模型与电磁暂态仿真模型,采用扫频分析法获取系统序阻抗特性,并结合奈奎斯特稳定性判据进行判别,验证理论分析的正确性。同时,提出针对性的抑制策略,如改进控制算法、引入阻尼补偿环节或优化控制器参数设计,以提升系统在弱电网环境下的稳定性。整个研究流程完整复现了博士论文级别的科研工作,具有较强的理论深度与工程应用价值。; 适合人群:适用于具备电力系统、电力电子或自动控制等相关专业背景,熟悉Matlab/Simulink仿真工具,正在从事新能源并网、电力系统稳定性分析、变流器控制策略研究的研究生、科研人员及电力行业工程技术开发者。; 使用场景及目标:①深入理解新能源并网系统在弱电网中发生宽频带振荡的物理本质与动态演化过程;②掌握基于频域阻抗法的系统稳定性建模与分析方法;③学习并复现高水平学术论文中的关键技术路线,提升独立科研能力与仿真建模水平;④为实际工程中新能源电站的并网稳定性问题提供理论依据与可行的抑制方案参考。; 阅读建议:建议读者结合文中提供的Matlab代码与Simulink仿真模型,逐步完成从阻抗建模、扫频仿真到稳定性判据应用的全过程实践,重点关注锁相环与电流环之间的动态耦合关系,并辅以相关文献深化对频域分析理论的理解,实现理论与仿真的深度融合。

80,490

社区成员

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

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