欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

带图标 快捷键 Menu - 终极版

程序员文章站 2022-07-03 17:44:21
...

Menu 改头换面 扩展如下:

 

1. 图标化文字

2. 快捷键功能 具体 参考xp - 菜单

 

 

[代码 步骤]

 

1. 定制化IconifiedTextItem 用于存放菜单选项需要的 图标资源 文字 快捷键

 

 

public class IconifiedTextItem {
	String text;
	Drawable icon;
	String shortcut;
	
public IconifiedTextItem(String s,Drawable d,String ss){
	text = s;
	icon = d;
	shortcut = ss;
}

public String getText(){
	return text;
}

public Drawable getIcon(){
	return icon;
}

public String getShortcut(){
	return shortcut;
}

}

 

 

2.  定义IconifiedTextAdapter 不仅用于存放具体菜单数据 即:图标 文字 快捷键 也定义菜单布局方式 故 extends BaseAdapter

 

public class IconifiedTextAdapter extends BaseAdapter {
	Context context;
	
	//存放菜单属性
	List<IconifiedTextItem> itemList;
	
	public IconifiedTextAdapter(Context c){
		context = c;
		
		itemList = new ArrayList<IconifiedTextItem>();
	}
	
	//添加一列菜单 包括:文字 图标 快捷键
	public void addItem(String string,int res,String shortcut){
		IconifiedTextItem it = new IconifiedTextItem(string,context.getResources().getDrawable(res),shortcut);
		itemList.add(it);
	}
	
	//根据快捷键名字  得出其索引值 返回-1 表示没有找到
	public int getShortcutByChar(char c){
		
		for(int i=0;i<itemList.size();i++){
			if(itemList.get(i).getShortcut().equals(""+c)){
				return i;
			}
		}
		return -1;
	}
	
	//----------------
	//extends BaseAdapter
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return itemList.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return arg0;
	}

	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {
		// TODO Auto-generated method stub
		LinearLayout lLayout = new LinearLayout(context);
		lLayout.setOrientation(LinearLayout.HORIZONTAL);
		
		ImageView image =new ImageView(context);
		image.setImageDrawable(itemList.get(arg0).getIcon());
		lLayout.addView(image, 
				new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,30));
		
		TextView text =new TextView(context);
		text.setText(itemList.get(arg0).getText());
		text.setGravity(Gravity.CENTER);
		lLayout.addView(text, 
				new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,30));
		
		TextView textShortcut =new TextView(context);
		textShortcut.setText(" ("+itemList.get(arg0).getShortcut()+")");
		textShortcut.setGravity(Gravity.CENTER);
		lLayout.addView(textShortcut, 
				new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,30));
		
		return lLayout;
	}

}

 

 

3. 定义函数setupMenu 用于执行菜单有关工作

 

public void setupMenu(){
    	viewMenu = this.getLayoutInflater().inflate(R.layout.menu, null);
    	popMenu = new PopupWindow(viewMenu,500,200);
    	lView = (ListView)viewMenu.findViewById(R.id.list);
    	
    	addExampleItem();
    	
    	addItemClickListener();
    	addItemShortcutListener();
    }

 

 

4. addExampleItem 用于添加菜单例子 并适配之  实现为:

 

public void addExampleItem(){
    	iTAdapter = new IconifiedTextAdapter(this);
    	iTAdapter.addItem("打开", R.drawable.favicon,"O");
    	iTAdapter.addItem("查看", R.drawable.favicon,"V");
    	iTAdapter.addItem("刷新", R.drawable.favicon,"E");
    	iTAdapter.addItem("新建", R.drawable.favicon,"w");
    	iTAdapter.addItem("属性", R.drawable.favicon,"R");
    	
    	lView.setAdapter(iTAdapter);
    }

 

 

5.  addItemClickListener 用于注册 菜单选项 可单击 然后执行之 实现为:

 

public void addItemClickListener(){
    	lView.setOnItemClickListener(new OnItemClickListener(){
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				executeMenuItem(arg2);
				popMenu.dismiss();
			}
    		
    		
    	});
    }

 

 

6. addItemShortcutListener 用于注册 快捷键  接受用户按下快捷键  然后根据用户输入 查出其索引值 再执行之 实现为:

 

public void addItemShortcutListener(){
    	//使得 PopupWindow 处于 可输入 状态  默认是不接受的
    	popMenu.setFocusable(true);
    	popMenu.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
    	
    	lView.setOnKeyListener(new OnKeyListener(){

			@Override
			public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
				// TODO Auto-generated method stub
				//解析 目标KeyEvent
				int code = arg2.getKeyCode();
				int action = arg2.getAction();
				
				//合法按键 且 按键抬起
				if((code >= KeyEvent.KEYCODE_A && code <= KeyEvent.KEYCODE_Z)&&
						action == KeyEvent.ACTION_UP){
					char key = (char)(arg2.getKeyCode() - KeyEvent.KEYCODE_A + 65);
					int id = iTAdapter.getShortcutByChar(key);
					
					if(id>=0){
						
						//to execute the dest operation
						executeMenuItem(id);
						
						popMenu.dismiss();
						return true;
					}
					return false;
				}
				else {//其他行为  按系统默认处理
					
					return false;
				}
			}
    		
    	});
    }

 

 

7.  注册onCreateOptionsMenu 当按下Menu 弹出PopupWindow

 

public boolean onCreateOptionsMenu(Menu menu) {
    	popMenu.showAtLocation(findViewById(R.id.main), Gravity.CENTER, 20, 20);
    	
    	//若返回值=false 表示 不弹出系统菜单  否则 弹出菜单
    	return false;
    }

 

 

8. 定义executeMenuItem 根据得到id 执行相关操作 因为此仅为演示 所以只会输出Log信息 大家可自行扩展

 

public void executeMenuItem(int id){
    	Log.d("TAG","Menu item:"+id);
    	
    }

 

 

9. emulator 运行效果 因为具体按键没有办法截图 所以只能看看界面

 

 带图标 快捷键 Menu - 终极版