android 中的menu一般是指上下文菜單或者是選項(xiàng)菜單 其中上選項(xiàng)菜單是可以在布局中res下的menu中在xml布局中寫好布局來(lái)的然后通過(guò)java代碼中的onCreateOptionsMenu來(lái)加載選項(xiàng)菜單,android4.4高級(jí)版本后是自動(dòng)把菜單加載到標(biāo)題欄上的,而不是低版本的按下menu鍵才顯是出來(lái)的,上下文菜單是是通過(guò)onCreateContextMenu這個(gè)方法來(lái)注冊(cè)上下文菜單的 下面講講如何獲取menu中的item 獲取上下文菜單的item其實(shí)就是當(dāng)單機(jī)選項(xiàng)菜單時(shí)會(huì)觸發(fā)這個(gè)方法 public boolean onContextItemSelected(MenuItem mi){//判斷單擊的是哪個(gè)菜單項(xiàng),并針對(duì)性的作出響應(yīng)。switch (mi.getItemId()){case FONT_RED:title.setTextColor(Color.RED);break;case FONT_GREEN:title.setTextColor(Color.GREEN);break;case FONT_BLUE:title.setTextColor(Color.BLUE);break;case MENU1:createdialog();break;}return true;}獲取選項(xiàng)菜單的item其實(shí)就是當(dāng)單擊選項(xiàng)菜單時(shí)會(huì)觸發(fā)這個(gè)方法public boolean onMenuItemSelected(int featureId, MenuItem item) {// 利用switch根據(jù)ItemId區(qū)分點(diǎn)擊的是哪個(gè)菜單 以便正確響應(yīng)用戶操作MenuItem temp= item;switch (item.getItemId()) {case R.id.rename:createdialog();break;case R.id.red:title.setTextColor(Color.RED);break;case R.id.green:title.setTextColor(Color.GREEN);break;case R.id.blue:title.setTextColor(Color.BLUE);break; // case R.id.choose_color: // createpopupmenu(temp); // break;}return super.onMenuItemSelected(featureId, item);}
10年積累的網(wǎng)站建設(shè)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有十堰鄖陽(yáng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
菜單資源文件必須放在res/menu目錄中。菜單資源文件必須使用menu標(biāo)簽作為根節(jié)點(diǎn)。除了menu標(biāo)簽外,還有另外兩個(gè)標(biāo)簽用于設(shè)置菜單項(xiàng)和分組,這兩個(gè)標(biāo)簽是item和group。
menu標(biāo)簽沒(méi)有任何屬性,但可以嵌套在item標(biāo)簽中,表示子菜單的形式。不過(guò)item標(biāo)簽中不能再嵌入item標(biāo)簽。
1.item標(biāo)簽的屬性含義如下:
Id:表示菜單項(xiàng)的資源ID
menuCategory:同種菜單項(xiàng)的種類。該屬性可取4個(gè)值:container、system、secondary和alternative。通過(guò)menuCategroy屬性可以控制菜單項(xiàng)的位置。例如將屬性設(shè)為system,表示該菜單項(xiàng)是系統(tǒng)菜單,應(yīng)放在其他種類菜單項(xiàng)的后面。
orderInCategor:同種類菜單的排列順序。該屬性需要設(shè)置一個(gè)整數(shù)值。例如menuCategory屬性值都為system的3個(gè)菜單項(xiàng)(item1、item2和item3)。將這3個(gè)菜單項(xiàng)的orderInCategory屬性值設(shè)為3、2、1,那么item3會(huì)顯示在最前面,而item1會(huì)顯示在最后面。
title:菜單項(xiàng)標(biāo)題(菜單項(xiàng)顯示的文本)
titleCondensed:菜單項(xiàng)的短標(biāo)題。當(dāng)菜單項(xiàng)標(biāo)題太長(zhǎng)時(shí)會(huì)顯示該屬性值
icon:菜單項(xiàng)圖標(biāo)資源ID
alphabeticShortcut:菜單項(xiàng)的字母快捷鍵
numericShortcut:菜單項(xiàng)的數(shù)字快捷鍵
checkable:表示菜單項(xiàng)是否帶復(fù)選框。該屬性可設(shè)計(jì)為true或false
checked:如果菜單項(xiàng)帶復(fù)選框(checkable屬性為true),該屬性表示復(fù)選框默認(rèn)狀態(tài)是否被選中??稍O(shè)置的值為true或false
visible:菜單項(xiàng)默認(rèn)狀態(tài)是否可視
enable:菜單項(xiàng)默認(rèn)狀態(tài)是否被激活
可能需要重寫的如下:
public boolean onCreateOptionsMenu(Menu menu)方法只被系統(tǒng)調(diào)用一次,如需要?jiǎng)討B(tài)更改菜單內(nèi)容還需重寫onPrepareOptionsMenu(Menu menu)方法實(shí)現(xiàn)
[java] view plain copy
Menu m=null;
int count=0;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if(count0){
if(count%2==0){
menu.removeGroup(1);
}else{
menu.add(1, Menu.FIRST, 0, "5st");
menu.add(1, Menu.FIRST+1, 0, "6st");
}
}
count++;
return super.onPrepareOptionsMenu(menu);
}
2,context menu(長(zhǎng)按屏幕產(chǎn)生)
[java] view plain copy
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
Toast.makeText(this, "you select"+item.getItemId(), 500).show();
break;
case 2:
Toast.makeText(this, "you select"+item.getItemId(), 500).show();
break;
}
return super.onContextItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, Menu.FIRST, 0, "1st");
menu.add(0, Menu.FIRST+1, 0, "2st");
super.onCreateContextMenu(menu, v, menuInfo);
}
新建自定義Menu————TabMenu.java如下:
package com.ncw;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout.LayoutParams;
public class TabMenu extends PopupWindow {
private GridView gridView;
private LinearLayout mLayout;
public TabMenu(Context context, OnItemClickListener bodyClick, int colorBgTabMenu) {
super(context);
mLayout = new LinearLayout(context);
mLayout.setOrientation(LinearLayout.VERTICAL);
gridView = new GridView(context);
gridView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));// 選中的時(shí)候?yàn)橥该魃?/p>
gridView.setNumColumns(4);
gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
gridView.setVerticalSpacing(0);
gridView.setHorizontalSpacing(0);
gridView.setPadding(0, 0, 0, 0);
gridView.setGravity(Gravity.CENTER);
gridView.setOnItemClickListener(bodyClick);
mLayout.addView(gridView);
// 設(shè)置默認(rèn)項(xiàng)
this.setContentView(mLayout);
this.setWidth(LayoutParams.FILL_PARENT);
this.setHeight(LayoutParams.WRAP_CONTENT);
this.setBackgroundDrawable(new ColorDrawable(colorBgTabMenu));// 設(shè)置TabMenu菜單背景
this.setFocusable(true);// menu菜單獲得焦點(diǎn) 如果沒(méi)有獲得焦點(diǎn)menu菜單中的控件事件無(wú)法響應(yīng)
}
public void SetBodySelect(int index, int colorSelBody) {
int count = gridView.getChildCount();
for (int i = 0; i count; i++) {
if (i != index)
((LinearLayout) gridView.getChildAt(i))
.setBackgroundColor(Color.TRANSPARENT);
}
((LinearLayout) gridView.getChildAt(index))
.setBackgroundColor(colorSelBody);
}
public void SetBodyAdapter(MenuBodyAdapter bodyAdapter) {
gridView.setAdapter(bodyAdapter);
}
/**
* 自定義Adapter,TabMenu的每個(gè)分頁(yè)的主體
*
*/
static public class MenuBodyAdapter extends BaseAdapter {
private Context mContext;
private int[] resID;
/**
* 設(shè)置TabMenu的分頁(yè)主體
*
* @param context
*??????????? 調(diào)用方的上下文
* @param resID
*/
public MenuBodyAdapter(Context context, int[] resID) {
this.mContext = context;
this.resID = resID;
}
@Override
public int getCount() {
return resID.length;
}
public Object getItem(int position) {
return makeMenyBody(position);
}
public long getItemId(int position) {
return position;
}
private LinearLayout makeMenyBody(int position) {
LinearLayout result = new LinearLayout(this.mContext);
result.setOrientation(LinearLayout.VERTICAL);
result.setGravity(Gravity.CENTER_HORIZONTAL
| Gravity.CENTER_VERTICAL);
result.setPadding(0, 0, 0, 0);
ImageView img = new ImageView(this.mContext);
img.setBackgroundResource(resID[position]);
result.addView(img, new LinearLayout.LayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)));
return result;
}
public View getView(int position, View convertView, ViewGroup parent) {
return makeMenyBody(position);
}
}
}
?
1
使用自定義Menu————testTabMenu.java
package com.ncw;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
public class testTabMenu extends Activity {
TabMenu.MenuBodyAdapter bodyAdapter = new TabMenu.MenuBodyAdapter(this,
new int[] { R.drawable.menu_01, R.drawable.menu_02,
R.drawable.menu_03, R.drawable.menu_04 });
TabMenu tabMenu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tabMenu = new TabMenu(this, new BodyClickEvent(), R.drawable.menu_bg);// 出現(xiàn)與消失的動(dòng)畫
tabMenu.update();
tabMenu.SetBodyAdapter(bodyAdapter);
}
class BodyClickEvent implements OnItemClickListener {
@Override
public void onItemClick(AdapterView? arg0, View arg1, int arg2,
long arg3) {
tabMenu.SetBodySelect(arg2, Color.GRAY);
Log.i("Log", " BodyClickEvent implements OnItemClickListener "
+ arg2);
}
}
@Override
/**
* 創(chuàng)建MENU
*/
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("menu");// 必須創(chuàng)建一項(xiàng)
return super.onCreateOptionsMenu(menu);
}
@Override
/**
* 攔截MENU
*/
public boolean onMenuOpened(int featureId, Menu menu) {
if (tabMenu != null) {
if (tabMenu.isShowing())
tabMenu.dismiss();
else {
tabMenu.showAtLocation(findViewById(R.id.LinearLayout01),
Gravity.BOTTOM, 0, 0);
}
}
return false;// 返回為true 則顯示系統(tǒng)menu
}
}
?xml version="1.0" encoding="utf-8"?
LinearLayout xmlns:android=""
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
TextView
android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="自定義Menu————張亞龍"
/TextView
/LinearLayout
運(yùn)行效果圖:
這是監(jiān)聽(tīng)手機(jī)上的主菜單文件的,點(diǎn)擊手機(jī)菜單鍵,會(huì)彈出一個(gè)菜單,1代表第一行命令,點(diǎn)擊就是推出程序,點(diǎn)擊第二個(gè)就是彈出軟件的介紹。
要想讓menu按鍵顯示在系統(tǒng)導(dǎo)航欄旁,需要改變AndroidManifest內(nèi)的
內(nèi)的最小
sdk版本。最高為10,不得高于10,否則無(wú)法現(xiàn)實(shí)在系統(tǒng)導(dǎo)航欄旁。個(gè)人想法是:Android3.0后加入了ActionBar控件和虛擬的按鍵,而ActionBar整合了menu功能導(dǎo)致android3.0以上的menu按鈕只能現(xiàn)實(shí)在ActionBar上,無(wú)法顯示在系統(tǒng)導(dǎo)航欄旁。