使用PopupWindow来做自定义menu,往PopupWindow增加一个子View,子View的布局就是menu的布局。

出现和退出的动画:可以给PopUpWindow或它的子view添加。

网上所有用PopupWindow做的menu有个共同特点:就是点击menu键出现PopupWindow,然后再点击menu键无法使PopupWindow退出/dismiss()。

当给PopupWindow设置了setFocusable(true),menu显示后,点击menu其他任何地方,menu都会消失,但是这时候按钮的点击事件其实是不响应的。同时只响应键盘的返回键,其他按键均不响应,比如点击menu键,没有任何反应。

要解决这个问题很简单,就是给PopupWindow的子View设置下面的代码:

//sub_view 是PopupWindow的子Viewsub_view.setFocusableInTouchMode(true);sub_view.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stubif ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行return true;}return false;}});


记住,一定要给PopupWindow设置setFocusable(true),要不然点击menu其他地方以及返回键,menu都不会退出。且这时候是响应PopupWindow的parent的menu事件的。

下面阐述为什么这么写之后,当PopupWindow显示后,点击menu键PopupWindow会退出的原因:

首先得明白为什么给PopupWindow setFocusable(true)后,点击menu出现PopupWindow后再点击menu没反应的原因。

PopupWindow初始化的时候一般都指定了在哪个View上出现,我们称这个View为parent。parent里面写了点击menu出现PopupWindow的事件,如果给PopupWindow setFocusable(true),此时屏幕的焦点在PopupWindow上面,肯定是不会响应parent的按键事件的,它只会响应PopupWindow的按键事件。

但是PopupWindow的本质是Window,没有继承View类,自己没有onkeyDown或onkey或dispatchKey这些事件的。我刚开始试着实现这些接口,但是按键依然不响应,不知原因。因现在对按键的原理还不熟,无法阐述其原因。

然后我想绕道而行,就是给PopupWindow的子View注册按键事件,setKeyListener,刚开始我在子View的xml设置了android:focusable=”true” 但按键事件依然不响应。。。。纠结啊纠结。。。然后没得办法,我google了所有关于PopupWindow的文章。。。最后终于被我发现。。。需要给PopupWindow的子View 设置setFocusableInTouchMode(true)。这时候按键事件就响应了。。。

下面附上完整代码:

    /*必须重写,否则点击MENU无反应  为了让他不显示,下面onMenuOpened()必须返回false*/@Overridepublic boolean onCreateOptionsMenu(Menu menu) {menu.add("menu");// 必须创建一项return super.onCreateOptionsMenu(menu);}/** * 拦截MENU */@Overridepublic boolean onMenuOpened(int featureId, Menu menu) {if(mPopupWindow != null){if(!mPopupWindow.isShowing()){/*最重要的一步:弹出显示   在指定的位置(parent)  最后两个参数 是相对于 x / y 轴的坐标*/mPopupWindow.showAtLocation(findViewById(R.id.linear_menu_parent), Gravity.BOTTOM, 0, 0);}}return false;// 返回为true 则显示系统menu}        private void initPopuWindow(int menuViewID){    LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);    /*设置显示menu布局   view子VIEW*/    sub_view = mLayoutInflater.inflate(menuViewID, null);    /*第一个参数弹出显示view  后两个是窗口大小*/    mPopupWindow = new PopupWindow(sub_view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);    /*设置背景显示*/    mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_menu_popup));    /*设置触摸外面时消失*/    mPopupWindow.setOutsideTouchable(true);    /*设置系统动画*/mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);mPopupWindow.update();mPopupWindow.setTouchable(true);/*设置点击menu以外其他地方以及返回键退出*/mPopupWindow.setFocusable(true);/** 1.解决再次点击MENU键无反应问题   *  2.sub_view是PopupWindow的子View */sub_view.setFocusableInTouchMode(true);sub_view.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stubif ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行return true;}return false;}});/*监听MENU事件*/menu = new View[3];menu[0] = sub_view.findViewById(R.id.menu_0);menu[1] = sub_view.findViewById(R.id.menu_1);menu[2] = sub_view.findViewById(R.id.menu_2);menu[0].setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// doSomething}});menu[1].setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// doSomething}});menu[2].setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// doSomething}});    }


网上有模仿UCweb的自定义menu的源码,下面是三个比较经典的文章:

  1. Android提高十八篇之自定义Menu(TabMenu)
  2. 【源码发布】仿UCWEB7.4界面最新Menu菜单 源码放出~!
  3. 模仿UCweb菜单

更多相关文章

  1. Android——IntentFilter匹配规则
  2. 初识ngCore
  3. 自定义控件:onDraw 方法实现仿 iOS 的开关效果
  4. .Net 转战 Android(安卓)4.4 日常笔记(4)--按钮事件和国际化
  5. Edittext失去焦点
  6. Android(安卓)Monkey测试
  7. 用Kotlin实现Android点击事件
  8. android 情景模式来电铃声分析(二)
  9. Android软键盘研究

随机推荐

  1. Android中横竖屏、全屏、无标题设置
  2. 2010.11.27———android 展示网络上的图
  3. Android中的集中常用布局方式和按钮事件
  4. LayoutAnimation
  5. 在Android上执行Java程序
  6. zxing项目源码解读(2.3.0版本,Android部分)
  7. Android创建自定义键盘
  8. Android(安卓)Service小实践
  9. Android(安卓)JNI环境搭建及开发入门
  10. Android(安卓)API 指南