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

转载请注明出处,谢谢 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事件都有相应。

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

时间: 2024-10-12 20:54:06

实现点击menu键popupWindow显示和消失的相关文章

去掉标题栏/ActionBar后点击menu键时应用崩溃

MainActivity 继承了 ActionBarActivity后,想要去掉标题栏(ActionBar),在程序中加上requestWindowFeature(Window.FEATURE_NO_TITLE);,结果标题栏是去掉了,但是在点击Menu键时应用会崩溃.在网上找了一下解决方法,都是把MainActivity继承ActionBarActivity改为继承Activity,这样虽然能够解决问题,但是如果一定是要继承ActionBarActivity不能改的话要怎么办呢?例如在我的程序

android部分机型(HTC D610) menu键的显示问题

今天遇到了一个很恶心的问题... htc某些机器的menu键是在屏幕里的,可以由系统控制显示和隐藏.今天遇到了一个问题,有两个应用,一个运行后显示menu键,另一个不显示... 找了好一会儿,发现是 android:targetSdkVersion="18"的问题 最终sdk build version 19(4.4.2),minSdkVersion = "8",不指定targetSdkVersion.就都显示了... android部分机型(HTC D610) m

禁用menu键

发现很多应用中基本不再使用menu键来显示菜单了,而在android studio中创建一个activity时,默认使用了actionBar,就是在右上角会显示三个点的内容,点击会出现Settings,当点击menu键时,在屏幕下方也会出现Settings菜单.如何禁用menu呢,重写onKeyDown方法即可.直接看代码 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 if(keyCode == K

点击返回键退出popupwindow的方法

点击返回键退出popupwindow mPopupWindow.setFocusable(true); 这句非常重要,对背景不会有影响 mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); 然后再设置它的键监听器 mView.setOnKeyListener(onKeyListener); private OnKeyListener onKeyListener=new OnKeyListener() { @Override publi

android的开发 华为手机上不显示menu键

android的开发,华为手机上不显示menu键解决办法: 在AndroidManifest.xml中讲targetSdkVersion改为9. <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="9" /> 原因: (2)高版本默认OptionsMenu在ActionBar里,不会有虚拟menu键: (1)华为没有菜单键的硬按钮.

Back键和Menu键程序退出弹窗以及按钮退出程序弹窗的实现

MainActivity.java package com.loaderman.backmenudemo; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInfla

安卓Menu键的问题

近期开发中有须要Menu键,结果发现了一个非常尴尬的问题.我的測试机上有Menu键.可是測试平板上没有,队友的測试机上竟然也没有Menu键.这着实有些尴尬... 上网谷歌之后才发现问题所在: 仅仅有在android 4.0 之前的机器中,menu 键是才作为硬件存在的,之后的机器有的有.有的就没有了,比方三星的S3,Note2等等都是有这个按键的.可是很多其它的手机取消了这个按键.所以假设project中实用到这个按键,那就必须调低最低版本号, 比方android 2.2 的project,跑到

android取消点击音量键弹出音量调节界面

比如在viewpager中点击音量键调节上一页下一页,return true就可以取消音量界面的显示 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (voiceRead.equals("open")) { if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { vp.setCurrentItem(vp.getCurrentItem()+1); return tr

Android PopupWindow显示位置设置

当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的那样,会发 生错位的情况,尤其是不同尺寸的平板上,那错位错的不是一般的不靠谱,而Android本身只提供了如下几个方法设置PopupWindow显示位置 showAsDropDown(View anchor, int xoff, int yoff) 以anchor的左下角为参照点,定义偏移 showAsDropDown(android.view.View) 以ancho