帶圖標 快捷鍵 Menu - 終極版

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 運行效果 因爲具體按鍵沒有辦法截圖 所以只能看看界面

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章