Android -- 弹出菜单Menu

本文详细介绍了在Android应用中如何在optionMenu中加入图标,并通过反射机制进行配置。同时,还展示了如何创建并自定义弹出菜单,包括设置图标、监听器和数据适配器,实现菜单项的交互与数据展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 如何在optionMenu中加入图标

	// enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
	private void setIconEnable(Menu menu, boolean enable) {
		try {
			Class<?> clazz = Class
					.forName("com.android.internal.view.menu.MenuBuilder");
			Method m = clazz.getDeclaredMethod("setOptionalIconsVisible",
					boolean.class);
			m.setAccessible(true);
			// MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
			m.invoke(menu, enable);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// setIconEnable(menu, true);
		// MenuInflater inflater = getMenuInflater();
		// inflater.inflate(R.menu.more, menu);

		/*
		 * 利用反射机制调用MenuBuilder的setOptionalIconsVisible方法设置mOptionalIconsVisible为true,给菜单设置图标时才可见
		 */
		setIconEnable(menu, true);
		String[] common = getResources().getStringArray(R.array.common);
		int[] drawable_resid = { R.drawable.ic_launcher, R.drawable.icon, .... };
		for (int i = 0; i < common.length; ++i) {
			menu.add(1, Menu.FIRST + i, i, common[i]).setIcon(<span style="font-family: Arial, Helvetica, sans-serif;">drawable_resid[i]</span>);
		}
		return true;
		// return super.onCreateOptionsMenu(menu);
	}
2.  弹出菜单Menu

	// viewHolder?
	AlertDialog menuDialog;// menu菜单Dialog
	GridView menuGrid;
	View menuView;
	private Context mContext;
	private MyListener monOnItemClickListener;
	private Handler mHandler;
	public ZPopupMenu(Context context, MyListener listener, Handler handler) {
		this.mContext = context;
		this.monOnItemClickListener = listener;
		this.mHandler = handler;
	}
	public void initMenu(int flag) {
		menuView = View.inflate(mContext, R.layout.gridview_menu, null);
		// if(menuDialog==null){
		// 创建AlertDialog
		menuDialog = new AlertDialog.Builder(mContext).create();
		menuDialog.setView(menuView);
		menuDialog.setOnKeyListener(new OnKeyListener() {
			public boolean onKey(DialogInterface dialog, int keyCode,
					KeyEvent event) {
				if (keyCode == KeyEvent.KEYCODE_MENU)// 监听按键
					dialog.dismiss();
				return true; // false?
			}
		});
		menuDialog.show();
		// }else{
		// menuDialog.show();
		// }
		if (flag == AREA) {
			menuGrid = (GridView) menuView.findViewById(R.id.gridview);
			menuGrid.setAdapter(Dic.getMenuAdapter(mContext, ZDGCApplication
					.getContext().getResources().getStringArray(R.array.area)));
			menuGrid.setOnItemClickListener(new OnItemClickListener() {

				@Override
				public void onItemClick(AdapterView<?> arg0, View arg1,
						int arg2, long arg3) {
					// TODO Auto-generated method stub
					int unitid = Dic.areaBO.get(arg2).getValue();
					if (monOnItemClickListener != null)
						monOnItemClickListener.onChoose(AREA, unitid);
					// Message message = new Message();
					// message.what = AREA;
					// message.obj = unitid;
					// mHandler.sendMessage(message);
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					menuDialog.dismiss();
					// Log.i("pop", "unitid="+unitid);

				}
			});
		} else if (flag == UNIT) {
			menuGrid = (GridView) menuView.findViewById(R.id.gridview);
			menuGrid.setAdapter(Dic.getMenuAdapter(mContext, ZDGCApplication
					.getContext().getResources().getStringArray(R.array.unit)));
			menuGrid.setOnItemClickListener(new OnItemClickListener() {

				@Override
				public void onItemClick(AdapterView<?> arg0, View arg1,
						int arg2, long arg3) {
					// TODO Auto-generated method stub
					int humanid = Dic.unitBO.get(arg2).getValue();
					if (monOnItemClickListener != null)
						monOnItemClickListener.onChoose(UNIT, humanid);
					// Message message = new Message();
					// message.what = UNIT;
					// message.obj = humanid;
					// mHandler.sendMessage(message);
					// Log.i("pop", "humanid="+humanid);
					menuDialog.dismiss();
				}
			});
		}

	}
3. 监听器

public interface MyListener {
	public void onChoose(int which, int id);

}
4. 获取全局context

public class ZDGCApplication extends Application {
	private static Context mContext;

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		mContext = getApplicationContext();
	}

	public static Context getContext() {
		return mContext;
	}

}
5. 队列对象

	public static List<CategoryBO> areaBO;
	public static List<CategoryBO> unitBO;

	public static void initinalize() {
		areaBO = new ArrayList<CategoryBO>();
		unitBO = new ArrayList<CategoryBO>();

		String[] area = ZDGCApplication.getContext().getResources()
				.getStringArray(R.array.area);
		int[] area_id = ZDGCApplication.getContext().getResources()
				.getIntArray(R.array.area_id);
		for (int i = 0; i < area.length; ++i) {
			CategoryBO temp = new CategoryBO();
			temp.setId(i);
			temp.setKey(area[i]);
			temp.setValue(area_id[i]);
			areaBO.add(temp);
		}

		String[] unit = ZDGCApplication.getContext().getResources()
				.getStringArray(R.array.unit);
		int[] unit_id = ZDGCApplication.getContext().getResources()
				.getIntArray(R.array.unit_id);
		for (int i = 0; i < unit.length; ++i) {
			CategoryBO temp = new CategoryBO();
			temp.setId(i);
			temp.setKey(unit[i]);
			temp.setValue(unit_id[i]);
			unitBO.add(temp);
		}
	}

	public static SimpleAdapter getMenuAdapter(final Context context,
			String[] resourceArray) {  // 此处可以加入图标,int[] resIcon
		ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < resourceArray.length; ++i) {
			HashMap<String, Object> temp = new HashMap<String, Object>();
			temp.put("name", resourceArray[i]);
			data.add(temp);
		}
		SimpleAdapter adapter = new SimpleAdapter(context, data,
				R.layout.menuitem, new String[] { "name" },
				new int[] { R.id.item_text });
		return adapter;
	}
<pre name="code" class="java">public class CategoryBO {
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	private int id;
	private String key;
	private int value;

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值