利用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的不可点击事件。