源碼源著微信
Android中菜單欄詳解
選項(xiàng)菜單:最常規(guī)的菜單,android中把它叫做option menu
子菜單:android中點(diǎn)擊子菜單將彈出懸浮窗口顯示子菜單項(xiàng)。子菜單不支持嵌套,即子菜單中不能再包括其他子菜單。
上下文菜單:android中長(zhǎng)按視圖控件后出現(xiàn)的菜單,windows點(diǎn)擊右鍵彈出的菜單即上下文菜單
圖標(biāo)菜單:這個(gè)比較簡(jiǎn)單,就是帶icon的菜單項(xiàng),需要注意的是子菜單項(xiàng)、上下文菜單項(xiàng)、擴(kuò)展菜單項(xiàng)均無法顯示圖標(biāo)。
選擇菜單(alternative menu):用的比較少,以后單獨(dú)介紹,本文先跳過(其實(shí)是我還沒弄明白啦o(≧v≦)o~~)
擴(kuò)展菜單:選項(xiàng)菜單最多只能顯示6個(gè)菜單項(xiàng),超過6個(gè)時(shí),第6個(gè)菜單項(xiàng)會(huì)被系統(tǒng)替換為一個(gè)叫“更多”的子菜單,原來顯示不下的菜單項(xiàng)都
為“更多”菜單的子菜單項(xiàng)。如下圖作
每個(gè) activity包含一個(gè)菜單,一個(gè)菜單又能包含多個(gè)菜單項(xiàng)和多個(gè)子菜單,子菜單其實(shí)也是菜單(因?yàn)樗鼘?shí)現(xiàn)了Menu接口),因此子菜單也可以包含多個(gè)菜 單項(xiàng)。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了兩個(gè)回調(diào)方法,用于創(chuàng)建 菜單項(xiàng)和響應(yīng)菜單項(xiàng)的點(diǎn)擊
[java] view plaincopy
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//為了兼容以后的版本
super.onCreateOptionsMenu(menu);
//多種方式添加菜單項(xiàng)
//menu.add("菜單項(xiàng)1");//1,直接指定標(biāo)題,這個(gè)響應(yīng)的時(shí)候我不知道怎么調(diào)用
//menu.add(R.string.menuitem2);//2,通過資源指定標(biāo)題
menu.add(1, Menu.FIRST, 1, "菜單項(xiàng)1");//3,顯式指定菜單項(xiàng)的組號(hào),ID , 排序,標(biāo)題
menu.add(1, Menu.FIRST+1, 2, "菜單項(xiàng)2");
menu.add(2, Menu.FIRST+2, 3, "菜單項(xiàng)3");
menu.add(2, Menu.FIRST+3, 4, "菜單項(xiàng)4");
menu.add(2, Menu.FIRST+4, 5, "菜單項(xiàng)5");
menu.add(2, Menu.FIRST+5, 6, "菜單項(xiàng)6");//多于6個(gè)將會(huì)被系統(tǒng)以更多字樣替換
menu.add(2, Menu.FIRST+6, 7, "菜單項(xiàng)7");
menu.add(2, Menu.FIRST+7, 8, "菜單項(xiàng)8");
[java] view plaincopy
return true;//如果希望現(xiàn)實(shí)菜單,返回true
使用的最多方法是重寫activity類的 onOptionsItemSelected(MenuItem)
回調(diào)方法,每當(dāng)有菜單項(xiàng)被點(diǎn)擊時(shí),android就會(huì)調(diào)用該方法,并傳入被點(diǎn)擊菜單項(xiàng)。
以下代碼可作為使用onOptionsItemSelected方法響應(yīng)菜單的模板來使用,這里為了方便起見將菜單ID硬編碼在程序里,你可以使用常量或資源ID來使代碼更健壯
[java] view plaincopy
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
//do something
Toast.makeText(this, "1", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(this, "2", Toast.LENGTH_LONG).show();
break;
case 3:
Toast.makeText(this, "3", Toast.LENGTH_LONG).show();
break;
case 4:
Toast.makeText(this, "4", Toast.LENGTH_LONG).show();
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
雖然上邊方法是推薦使用的方法,android還是提供了類似java swing的監(jiān)聽器方式來響應(yīng)菜單。使用監(jiān)聽器的方式分為兩步:
[java] view plaincopy
//第一步:為菜單項(xiàng)注冊(cè)監(jiān)聽器
menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener());
//第二步:創(chuàng)建監(jiān)聽器類
class MyMenuItemClickListener implements OnMenuItemClickListener {
@Override
publicboolean onMenuItemClick(MenuItem item) {
switch(){
// do something here...
}
return true; //finish handling
}
}
該方法先于onOptionsItemSelected執(zhí)行。
[java] view plaincopy
<h1 style="font-family: verdana; "><a name="t4"></a>2,子菜單Sub Menu</h1><span style="font-family: verdana; ">Android支持子菜單,你可以通過addSubMenu</span><span style="font-family: verdana; ">(int groupId, int itemId, int order, int titleRes)方法非常方便的創(chuàng)建和響應(yīng)子菜單。</span>
[java] view plaincopy
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//為了兼容以后的版本
super.onCreateOptionsMenu(menu);
//添加子菜單
//一個(gè)菜單可以有多個(gè)子菜單
menu.addSubMenu(1, Menu.FIRST, 1, "系統(tǒng)設(shè)置" );
SubMenu subMenu = menu.addSubMenu(1, Menu.FIRST+1, 2, "網(wǎng)絡(luò)設(shè)置" );//子菜單支持圖標(biāo)
subMenu.setIcon(R.drawable.ic_launcher);
MenuItem menuItem = subMenu.add(2, Menu.FIRST+2, Menu.NONE, "菜單項(xiàng)1");//子菜單項(xiàng)不支持顯示圖標(biāo)
//menuItem.setIcon(R.drawable.ic_launcher);
subMenu.add(2, Menu.FIRST+3, Menu.NONE, "菜單項(xiàng)2");
subMenu.add(2, Menu.FIRST+4, Menu.NONE, "菜單項(xiàng)3");
subMenu.add(2, Menu.FIRST+5, Menu.NONE, "菜單項(xiàng)4");
return true;//如果希望現(xiàn)實(shí)菜單,返回true
}
上面的代碼演示了如何創(chuàng)建子菜單,其菜單項(xiàng)的響應(yīng)其實(shí)就是普通菜單項(xiàng)的響應(yīng)
Android支持在菜單上顯示各種各樣的圖標(biāo),這一點(diǎn)我們?cè)谏厦鎰?chuàng)建子菜單時(shí)已經(jīng)用到了
[java] view plaincopy
SubMenu subMenu = menu.addSubMenu(1, Menu.FIRST+1, 2, "網(wǎng)絡(luò)設(shè)置" );//子菜單支持圖標(biāo)
subMenu.setIcon(R.drawable.ic_launcher);
Android中并不是所謂的菜單項(xiàng)都能加上圖標(biāo),以下菜單項(xiàng)都是不可以的(這并不意味著程序會(huì)報(bào)錯(cuò),而是運(yùn)行時(shí)圖標(biāo)得不到顯示):
擴(kuò)展的菜單項(xiàng)。
子菜單的菜單項(xiàng)
上下文菜單的菜單項(xiàng)
在Windows中,我們已經(jīng)習(xí)慣了在文件上單擊右鍵來執(zhí)行“打開”、“重名名”、“剪切”、“刪除”等操作,這個(gè)右鍵彈出的菜單就是上下文菜單.
android是通過長(zhǎng)按某個(gè)視圖元素來彈出上下文菜單的.
上下 文菜單與Options Menu最大的不同在于,Options Menu的擁有者是Activity,而上下文菜單的擁有者是Activity中的View。每個(gè)Activity有且只有一個(gè)Options Menu,它為整個(gè)Activity服務(wù)。而一個(gè)Activity往往有多個(gè)View,并不是每個(gè)View都有上下文菜單,這就需要我們顯示地通過
registerForContextMenu(Viewview)來指定。
下面給出一個(gè)demo演示如何創(chuàng)建和響應(yīng)上下文菜單:
1.在activity的onCreate(...)方法中為一個(gè)view注冊(cè)上下文菜單
2.在onCreateContextMenuInfo(...)中生成上下文菜單。
3.在onContextItemSelected(...)中響應(yīng)上下文菜單項(xiàng)。
[java] view plaincopy
public class MenuDemoActivity extends Activity {
private ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();//做一些初始化工作
}
private void initView() {
listView = (ListView) this.findViewById(R.id.listview);
listView.setAdapter(new MyAdapter());
this.registerForContextMenu(listView);//1 為所有列表項(xiàng)注冊(cè)上下文菜單,注意和響應(yīng)事件不一樣
}
//給ListView提供一些數(shù)據(jù)
private class MyAdapter extends BaseAdapter{
public int getCount() {
return 5;
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(MenuDemoActivity.this);
tv.setText("文件"+position);
return tv;
}
}
@Override
//2 創(chuàng)建上下文菜單
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("文件操作");
menu.add(1, Menu.FIRST, Menu.NONE, "發(fā)送");
menu.add(1, Menu.FIRST+1, Menu.NONE, "標(biāo)記為重要");
menu.add(1, Menu.FIRST+2, Menu.NONE, "重命名");
menu.add(1, Menu.FIRST+3, Menu.NONE, "刪除");
}
@Override
//3 響應(yīng)上下文菜單
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
Toast.makeText(this, "發(fā)送", 1).show();
break;
case 2:
Toast.makeText(this, "標(biāo)記為重要", 1).show();
break;
case 3:
Toast.makeText(this, "重命名", 1).show();
break;
case 4:
Toast.makeText(this, "刪除", 1).show();
break;
default:
return super.onContextItemSelected(item);
}
return true;
}
}
運(yùn)行程序,多次調(diào)出上下文菜單,注意LogCat的輸出,onCreateContextMenu每一次都被調(diào)用了。
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項(xiàng)目群及時(shí)溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽(yù)堅(jiān)持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: