转载请注明出处,谢谢 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事件都有相应。
现在我想要的效果就出现了,嘿嘿,不错吧~~~~