本示例,用 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;
    }
}

 

相关文章: