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