读书人

利用popupWindow回制作自定义menu

发布时间: 2012-09-02 21:00:34 作者: rapoo

利用popupWindow来制作自定义menu
我找了好久没发现怎么给系统自带的menu换背景,网上有个帖子写了相关方法,但是我没实现

所以才去了用popupwindow来实现menu:

先定义了这个popupwindow类:

public class MenuPopupWindow {public PopupWindow pop;private Context ctx;boolean isPopShowing = false;Handler menuHandler;public MenuPopupWindow(Context ctx,Handler menuHandler){this.ctx = ctx;this.menuHandler = menuHandler;initMenu();}    private void initMenu() {LayoutInflater inflater = LayoutInflater.from(ctx);View view = inflater.inflate(R.layout.popwindow, null);pop = new PopupWindow(view, 480, 173);// 大小设置pop.setOutsideTouchable(false);// 很奇怪,不设置background 点击pop外面,pop不会消失//pop.setBackgroundDrawable(new BitmapDrawable());pop.setBackgroundDrawable(ctx.getResources().getDrawable(R.drawable.menubg));pop.setFocusable(true);// 如果不加这个,Grid不会响应ItemClickpop.setOnDismissListener(new OnDismissListener() {public void onDismiss() {isPopShowing = false;}});GridView menuGrid = (GridView) view.findViewById(R.id.gridview);menuGrid.setSelector(new ColorDrawable(Color.TRANSPARENT));menuGrid.setAdapter(new AdapterGridView(ctx));//menuGrid.setAdapter(getMenuAdapter(menuNameArray, menuImageArray));menuGrid.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {menuHandler.sendEmptyMessage(arg2);//发消息给主线程来处理if (pop.isShowing()) // 关闭菜单pop.dismiss();}});menuGrid.setOnKeyListener(onKey);}    OnKeyListener onKey = new OnKeyListener() {public boolean onKey(View v, int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (keyCode == KeyEvent.KEYCODE_MENU && isPopShowing == false) {isPopShowing = true;} else {isPopShowing = false;pop.dismiss();}return false;}    };    }


然后在主程序里面 生成这个类的对象,在自己想要显示的位置显示之
MenuPopupWindow myPop = new MenuPopupWindow(this,menuHandler);pop = myPop.pop;public boolean onCreateOptionsMenu(Menu menu) {pop.showAtLocation(findViewById(R.id.main), Gravity.CENTER| Gravity.BOTTOM, 0, 0);return false;}


popupwindow 里面的gridview设置的监听器 handler发出的消息会在主程序中做相应的动作

public Handler menuHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 0:                        //do something        break;case 1:                       //do somethingbreak;case 2:                       //do somethingbreak;case 3:                       //do somethingbreak;case 4:                       //do somethingbreak;case 5:                       //do somethingbreak;default:break;}}};


gridView里面 设置TRANSPARENT 是为了去掉 自身的点击效果,用来加上自己的selector

然后在adapter里面可以对 单个的Item 设置clickable 同时 换七背景来实现

类似menu的不可点击事件。

读书人网 >移动开发

热点推荐