码迷,mamicode.com
首页 > Windows程序 > 详细

实现点击menu键popupWindow显示和消失

时间:2015-04-23 11:02:35      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:


转载请注明出处,谢谢 http://blog.csdn.net/harryweasley/article/details/45217273

最近想实现一个这样的功能:点击menu键,popupWindow显示出来,再点击menu键,popupWindow消失,同时也可以点击正常的按钮使popupWindow出来和消失。


我说的是不是有点乱,那就看下具体的效果图,就像微信的这个效果一样的,如图所示:

技术分享

这个popupWindow既可以通过点击“+”号出来,也可以点击menu键出来,当然也可以点击屏幕或者menu键消失。


点击“+”号出来很简单了,就直接

right.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				showPopupWindow();
			}

		});



为了点击menu键让popupWindow显示出来,我们要在Activity下重写这样的一个代码,点击menu键,判断popupWindow是否显示,显示则消失,否则显示。


@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {

		switch (keyCode) {
		case KeyEvent.KEYCODE_MENU:
			if (popupWindow != null && popupWindow.isShowing()) {
				popupWindow.dismiss();
			} else {
				showPopupWindow();
			}

			break;
		}
		return super.onKeyDown(keyCode, event);
	}



其中showPopupWindow()中的方法是这样的。


/**
	 * 显示popupWindow
	 */
	private void showPopupWindow() {
		// TODO 这里是显示popupWindow的代码
		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		view = inflater.inflate(R.layout.popupwindow, null);
		int width = getWindow().getDecorView().getWidth() / 3;
		Log.i("宽度", width + "");
		popupWindow = new PopupWindow(view, width,
				WindowManager.LayoutParams.WRAP_CONTENT);
		popupWindow.setFocusable(true);
		// popupWindow.setBackgroundDrawable(new BitmapDrawable());
		ColorDrawable dw = new ColorDrawable(-00000);
		popupWindow.setBackgroundDrawable(dw);
		popupWindow.showAsDropDown(MainActivity.this.findViewById(R.id.right),
				-dip2px(MainActivity.this, 100), 0);

	}

通过上面的方法后,你会发现一个问题,当我点击menu键popupWindow弹出来了,但是当我再次点击menu键,popupWindow并不会消失,只能点击屏幕消失


这显然不是我们想要的效果,popupWindow出来后,之所以再次点击menu键没反应,是因为当popupWindow在显示的时候,popupWindow获得了焦点,那么Activity里面的onKeyDown(int keyCode, KeyEvent event)是不会被响应了的,即Activity的按键事件是不会有所响应的。


那么为了让popupWindow显示的时候,还可以点击menu键做相应的操作,我们可以获取popupWindow的一个子view(我是获取的最外层的LinearLayout),设置setOnKeyListener,让这个view在popupWindow显示的时候响应menu的按键事件,上面的两个代码就变为下面的了


@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {

		switch (keyCode) {
		case KeyEvent.KEYCODE_MENU:
			isMenuShow = true;
			showPopupWindow();
			break;
		}
		return super.onKeyDown(keyCode, event);
	}



/**
	 * 显示popupWindow
	 */
	private void showPopupWindow() {
		// TODO 这里是显示popupWindow的代码
		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		view = inflater.inflate(R.layout.popupwindow, null);
		LinearLayout ll = (LinearLayout) view.findViewById(R.id.line);
		int width = getWindow().getDecorView().getWidth() / 3;
		Log.i("宽度", width + "");
		popupWindow = new PopupWindow(view, width,
				WindowManager.LayoutParams.WRAP_CONTENT);
		popupWindow.setFocusable(true);
		ll.setFocusableInTouchMode(true);
		ll.setOnKeyListener(new OnKeyListener() {

			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (keyCode == KeyEvent.KEYCODE_MENU) {
					if (!isMenuShow) {
						popupWindow.dismiss();
					}
					isMenuShow = false;

				}
				return false;
			}
		});
		// popupWindow.setBackgroundDrawable(new BitmapDrawable());
		ColorDrawable dw = new ColorDrawable(-00000);
		popupWindow.setBackgroundDrawable(dw);
		popupWindow.showAsDropDown(MainActivity.this.findViewById(R.id.right),
				-dip2px(MainActivity.this, 100), 0);

	}




我加了一个boolean


/**
	 * 是否是点击menu键打开popupWindow的,默认为false
	 */
	boolean isMenuShow = false;

这个必须要加,要不会造成,点击menu键的时候,popupWindow出来后,马上又消失,因为上面的两个menu事件都有相应。


现在我想要的效果就出现了,嘿嘿,不错吧~~~~

实现点击menu键popupWindow显示和消失

标签:

原文地址:http://blog.csdn.net/harryweasley/article/details/45217273

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!