文章目錄
選項菜單和子菜單
菜單項關聯的Activity
上下文菜單
選項菜單和子菜單(SubMenu)
Java代碼中定義
Android系統菜單支持接口圖
借用了下網上的圖!如若侵犯到某人的利益,請及時告知,及時刪除!
兩個方法:
add():添加一個新菜單。
addSubMenu:添加一個新的子菜單。
代碼區:
Activity代碼:
public class MainActivity extends Activity
{
// 定義字體大小菜單項的標識
final int FONT_10 = 0x111;
final int FONT_12 = 0x112;
final int FONT_14 = 0x113;
final int FONT_16 = 0x114;
final int FONT_18 = 0x115;
// 定義普通菜單項的標識
final int PLAIN_ITEM = 0x11b;
// 定義字體顏色菜單項的標識
final int FONT_RED = 0x116;
final int FONT_BLUE = 0x117;
final int FONT_GREEN = 0x118;
private EditText edit;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
edit = (EditText) findViewById(R.id.txt);
}
// 當用戶單擊MENU鍵時觸發該方法
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// -------------向menu中添加字體大小的子菜單-------------
SubMenu fontMenu = menu.addSubMenu("字體大小");
// 設置菜單的圖標
fontMenu.setIcon(R.drawable.font);
// 設置菜單頭的圖標
fontMenu.setHeaderIcon(R.drawable.font);
// 設置菜單頭的標題
fontMenu.setHeaderTitle("選擇字體大小");
fontMenu.add(0, FONT_10, 0, "10號字體");
fontMenu.add(0, FONT_12, 0, "12號字體");
fontMenu.add(0, FONT_14, 0, "14號字體");
fontMenu.add(0, FONT_16, 0, "16號字體");
fontMenu.add(0, FONT_18, 0, "18號字體");
// -------------向menu中添加普通菜單項-------------
menu.add(0, PLAIN_ITEM, 0, "普通菜單項");
// -------------向menu中添加文字顏色的子菜單-------------
SubMenu colorMenu = menu.addSubMenu("字體顏色");
colorMenu.setIcon(R.drawable.color);
// 設置菜單頭的圖標
colorMenu.setHeaderIcon(R.drawable.color);
// 設置菜單頭的標題
colorMenu.setHeaderTitle("選擇文字顏色");
colorMenu.add(0, FONT_RED, 0, "紅色");
colorMenu.add(0, FONT_GREEN, 0, "綠色");
colorMenu.add(0, FONT_BLUE, 0, "藍色");
return super.onCreateOptionsMenu(menu);
}
@Override
// 選項菜單的菜單項被單擊後的回調方法
public boolean onOptionsItemSelected(MenuItem mi)
{
//判斷單擊的是哪個菜單項,並有針對性地作出響應
switch (mi.getItemId())
{
case FONT_10:
edit.setTextSize(10 * 2);
break;
case FONT_12:
edit.setTextSize(12 * 2);
break;
case FONT_14:
edit.setTextSize(14 * 2);
break;
case FONT_16:
edit.setTextSize(16 * 2);
break;
case FONT_18:
edit.setTextSize(18 * 2);
break;
case FONT_RED:
edit.setTextColor(Color.RED);
break;
case FONT_GREEN:
edit.setTextColor(Color.GREEN);
break;
case FONT_BLUE:
edit.setTextColor(Color.BLUE);
break;
case PLAIN_ITEM:
Toast toast = Toast.makeText(MainActivity.this
, "您單擊了普通菜單項" , Toast.LENGTH_SHORT);
toast.show();
break;
}
return true;
}
}
使用XML文件定義
Activity代碼:
public class MainActivity extends Activity
{
private TextView txt;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt = (TextView) findViewById(R.id.txt);
// 爲文本框註冊上下文菜單
registerForContextMenu(txt);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflator = new MenuInflater(this);
//裝填R.menu.my_menu對應的菜單,並添加到menu中
inflator.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
// 創建上下文菜單時觸發該方法
@Override
public void onCreateContextMenu(ContextMenu menu, View source,
ContextMenu.ContextMenuInfo menuInfo)
{
MenuInflater inflator = new MenuInflater(this);
//裝填R.menu.context對應的菜單,並添加到menu中
inflator.inflate(R.menu.context , menu);
menu.setHeaderIcon(R.drawable.tools);
menu.setHeaderTitle("請選擇背景色");
}
// 上下文菜單中菜單項被單擊時觸發該方法
@Override
public boolean onContextItemSelected(MenuItem mi)
{
// 勾選該菜單項
mi.setChecked(true); // ①
switch (mi.getItemId())
{
case R.id.red:
mi.setChecked(true);
txt.setBackgroundColor(Color.RED);
break;
case R.id.green:
mi.setChecked(true);
txt.setBackgroundColor(Color.GREEN);
break;
case R.id.blue:
mi.setChecked(true);
txt.setBackgroundColor(Color.BLUE);
break;
}
return true;
}
@Override
// 菜單項被單擊後的回調方法
public boolean onOptionsItemSelected(MenuItem mi)
{
if(mi.isCheckable())
{
// 勾選該菜單項
mi.setChecked(true); // ②
}
//判斷單擊的是哪個菜單項,並有針對性地作出響應
switch (mi.getItemId())
{
case R.id.font_10:
txt.setTextSize(10 * 2);
break;
case R.id.font_12:
txt.setTextSize(12 * 2);
break;
case R.id.font_14:
txt.setTextSize(14 * 2);
break;
case R.id.font_16:
txt.setTextSize(16 * 2);
break;
case R.id.font_18:
txt.setTextSize(18 * 2);
break;
case R.id.red_font:
txt.setTextColor(Color.RED);
mi.setChecked(true);
break;
case R.id.green_font:
txt.setTextColor(Color.GREEN);
mi.setChecked(true);
break;
case R.id.blue_font:
txt.setTextColor(Color.BLUE);
mi.setChecked(true);
break;
case R.id.plain_item:
Toast toast = Toast.makeText(MainActivity.this
, "您單擊了普通菜單項", Toast.LENGTH_SHORT);
toast.show();
break;
}
return true;
}
}
menu_main.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="@string/font_size"
android:icon="@drawable/font">
<menu>
<!-- 定義一組單選菜單項 -->
<group android:checkableBehavior="single">
<!-- 定義多個菜單項 -->
<item
android:id="@+id/font_10"
android:title="@string/font_10"/>
<item
android:id="@+id/font_12"
android:title="@string/font_12"/>
<item
android:id="@+id/font_14"
android:title="@string/font_14"/>
<item
android:id="@+id/font_16"
android:title="@string/font_16"/>
<item
android:id="@+id/font_18"
android:title="@string/font_18"/>
</group>
</menu>
</item>
<!-- 定義一個普通菜單項 -->
<item android:id="@+id/plain_item"
android:title="@string/plain_item">
</item>
<item android:title="@string/font_color"
android:icon="@drawable/color">
<menu>
<!-- 定義一組普通的菜單項 -->
<group>
<!-- 定義三個菜單項 -->
<item
android:id="@+id/red_font"
android:title="@string/red_title"/>
<item
android:id="@+id/green_font"
android:title="@string/green_title"/>
<item
android:id="@+id/blue_font"
android:title="@string/blue_title"/>
</group>
</menu>
</item>
</menu>
context.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定義一組單選菜單項目 -->
<group android:checkableBehavior="single">
<!-- 定義三個菜單項 -->
<item
android:id="@+id/red"
android:title="@string/red_title"
android:alphabeticShortcut="r"/>
<item
android:id="@+id/green"
android:title="@string/green_title"
android:alphabeticShortcut="g"/>
<item
android:id="@+id/blue"
android:title="@string/blue_title"
android:alphabeticShortcut="b"/>
</group>
</menu>
如何菜單項設置關聯Activity
調用setIntent()方法即可,可以把該菜單項與指定的Intent關聯到一起。
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// -------------向menu中添加子菜單-------------
SubMenu prog = menu.addSubMenu("啓動程序");
// 設置菜單頭的圖標
prog.setHeaderIcon(R.drawable.tools);
// 設置菜單頭的標題
prog.setHeaderTitle("選擇您要啓動的程序");
// 添加菜單項
MenuItem item = prog.add("查看Swift");
//爲菜單項設置關聯的Activity
item.setIntent(new Intent(this , OtherActivity.class));
return super.onCreateOptionsMenu(menu);
}
}
上下文菜單
## 開發上下文菜單的步驟如下:
1:重寫Activity的onCreateContextMenu(Context menu,View source,ContextMenu Context MenuInfo menuInfo)方法:
2:調用Activity的registerForContextMenu(View view)方法爲view組件註冊上下文菜單
3:如果希望應用程序能爲菜單項提供響應,則可以重寫onContextItemSelected(MenuItem mi)方法,或者指定菜單綁定事件監聽器。
代碼區:
Activity代碼:
public class MainActivity extends Activity
{
// 爲每個菜單定義一個標識
final int MENU1 = 0x111;
final int MENU2 = 0x112;
final int MENU3 = 0x113;
private TextView txt;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt = (TextView) findViewById(R.id.txt);
// 爲文本框註冊上下文菜單
registerForContextMenu(txt);
}
// 創建上下文菜單時觸發該方法
@Override
public void onCreateContextMenu(ContextMenu menu, View source,
ContextMenu.ContextMenuInfo menuInfo)
{
menu.add(0, MENU1, 0, "紅色");
menu.add(0, MENU2, 0, "綠色");
menu.add(0, MENU3, 0, "藍色");
// 將三個菜單項設爲單選菜單項
menu.setGroupCheckable(0, true, true);
//設置上下文菜單的標題、圖標
menu.setHeaderIcon(R.drawable.tools);
menu.setHeaderTitle("選擇背景色");
}
// 上下文菜單的菜單項被單擊時觸發該方法
@Override
public boolean onContextItemSelected(MenuItem mi)
{
switch (mi.getItemId())
{
case MENU1:
mi.setChecked(true);
txt.setBackgroundColor(Color.RED);
break;
case MENU2:
mi.setChecked(true);
txt.setBackgroundColor(Color.GREEN);
break;
case MENU3:
mi.setChecked(true);
txt.setBackgroundColor(Color.BLUE);
break;
}
return true;
}
}
使用PopupMenu創建彈出式菜單
創建步驟:
1:調用PopupMenu(Context context,View anchor)創建下拉菜單,anchor代表要激發彈出菜單組件
2:調用MenuInflate()方法將菜單資源填充到PopupMenu中。
3:調用PopupMenu的show()方法顯示彈出菜單
popup_menu.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/search"
android:icon="@android:drawable/ic_menu_search"
android:title="查找" />
<item
android:id="@+id/add"
android:icon="@android:drawable/ic_menu_add"
android:title="添加" />
<item
android:id="@+id/edit"
android:icon="@android:drawable/ic_menu_edit"
android:title="編輯">
<menu>
<item
android:id="@+id/copy"
android:title="複製" />
<item
android:id="@+id/cut"
android:title="剪切" />
<item
android:id="@+id/paste"
android:title="粘貼" />
</menu>
</item>
<item
android:id="@+id/exit"
android:title="隱藏菜單" />
</menu>
Activity代碼:
public class MainActivity extends Activity
{
PopupMenu popup = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onPopupButtonClick(View button)
{
// 創建PopupMenu對象
popup = new PopupMenu(this, button);
// 將R.menu.popup_menu菜單資源加載到popup菜單中
getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
// 爲popup菜單的菜單項單擊事件綁定事件監聽器
popup.setOnMenuItemClickListener(
new PopupMenu.OnMenuItemClickListener()
{
@Override
public boolean onMenuItemClick(MenuItem item)
{
switch (item.getItemId())
{
case R.id.exit:
// 隱藏該對話框
popup.dismiss();
break;
default:
// 使用Toast顯示用戶單擊的菜單項
Toast.makeText(MainActivity.this,
"您單擊了【" + item.getTitle() + "】菜單項"
, Toast.LENGTH_SHORT).show();
}
return true;
}
});
popup.show();
}
}
有問題歡迎留言,及時回覆。