本示例,用 popupWindow 自定义弹出菜单
public class CustomActionProvider extends ActionProvider implements OnMenuItemClickListener, OnClickListener, OnTouchListener, OnKeyListener { private final Context context;// 上下文 private View actionView;//action view private PopupWindow mPopupWindow;//popup window 里有个view,view显示的像个menu private View mMenu; //popup window 里的显示控件 private void initPopupMenu(){ LayoutInflater lif = LayoutInflater.from(context); mMenu = lif.inflate(R.layout.custom_popup_window, null); //不用setBackgroundDrawable的时候必须加这句才能back键和menu键退出 mMenu.setFocusableInTouchMode(true); mMenu.setOnKeyListener(this); mMenu.setOnTouchListener(this); mPopupWindow = new PopupWindow(mMenu, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); /* * setBackgroundDrawable很重要,没有这个函数 back键和menu键关闭popwindow 很麻烦, * 有了它以后,就不用为popwindow内的控件分别设置setOnKeyListener和setOnTouchListener了 * 可以同时支持back返回和点popwindow外面关闭popwindow, */ // mPopupWindow.setBackgroundDrawable(new ColorDrawable(-00000)); mPopupWindow.setFocusable(true); mPopupWindow.setOutsideTouchable(true); mPopupWindow.setAnimationStyle(R.anim.popwindow_anim); mMenu.findViewById(R.id.btn1_popup_window).setOnClickListener(this); mMenu.findViewById(R.id.btn2_popup_window).setOnClickListener(this); mMenu.findViewById(R.id.btn3_popup_window).setOnClickListener(this); mMenu.findViewById(R.id.btn4_popup_window).setOnClickListener(this); mMenu.findViewById(R.id.btnClose_popup_window).setOnClickListener(this); } //... @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_action_view_for_costomProvider: { mPopupWindow.showAsDropDown(v,-20,10); } return; case R.id.btn4_popup_window: case R.id.btn3_popup_window: case R.id.btn2_popup_window: case R.id.btn1_popup_window: Toast.makeText(context, "popup window item clicked", Toast.LENGTH_SHORT).show(); break; case R.id.btnClose_popup_window: break; } mPopupWindow.dismiss(); } @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_MENU: if (mPopupWindow != null && mPopupWindow.isShowing()) { mPopupWindow.dismiss(); } break; } return true; } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub mPopupWindow.dismiss(); return false; } }