Android菜單包括選項菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu)三種,本節(jié)將對這選項菜單的用法進(jìn)行學(xué)習(xí)。
選項菜單共有五個常用的方法,下面對這些方法進(jìn)行一一介紹:
下面通過靜態(tài)和動態(tài)的方式構(gòu)建選項菜單
1.靜態(tài)方式:通過定義xml文件的形式確定子項菜單 菜單文件(menu.xml)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/meun1"
android:icon="@mipmap/ic_launcher"
android:orderInCategory="3"
android:title="菜單一" />
<item
android:id="@+id/menu2"
android:orderInCategory="2"
android:title="菜單二" />
<item
android:id="@+id/menu3"
android:enabled="false"
android:orderInCategory="4"
android:title="不可用菜單" />
</menu>
這里定義了三個item,每個item都有特定的屬性,下面總結(jié)一下常用屬性含義:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-1.png" alt="這里寫圖片描述" />
MainActivity代碼(MainActivity.java)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.meun1:
Toast.makeText(MainActivity.this, "菜單一被選擇了", Toast.LENGTH_SHORT).show();
break;
case R.id.menu2:
Toast.makeText(MainActivity.this, "菜單二被選擇了", Toast.LENGTH_SHORT).show();
break;
case R.id.menu3:
Toast.makeText(MainActivity.this, "菜單三被選擇了", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
Toast.makeText(MainActivity.this, "選項菜單開啟", Toast.LENGTH_SHORT).show();
return super.onMenuOpened(featureId, menu);
}
@Override
public void onOptionsMenuClosed(Menu menu) {
super.onOptionsMenuClosed(menu);
Toast.makeText(MainActivity.this, "選項菜單關(guān)閉", Toast.LENGTH_SHORT).show();
}
}
這里使用了getMenuInflater().inflate(R.menu.menu,menu);方式導(dǎo)入菜單文件,inflate方法需要傳入兩個參數(shù),第一個是菜單文件,第二個是Menu對象。同時也調(diào)用了onOptionsItemSelected方法監(jiān)聽菜單項的選擇,調(diào)用了onMenuOpened和onOptionMenuClosed方法監(jiān)聽菜單選項的打開和關(guān)閉。
運(yùn)行項目實(shí)例:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-2.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-3.png" alt="這里寫圖片描述" />
我們在menu文件中設(shè)置了第三個菜單的enable為false,所以它不可點(diǎn)擊。
2.動態(tài)方式
MainActivity(MainActivity.java)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {//創(chuàng)建選項菜單
menu.add(menu.NONE, 1, 1, "菜單1");
menu.add(menu.NONE, 2, 2, "菜單2");
menu.add(menu.NONE, 3, 3, "菜單3");
menu.add(menu.NONE, 4, 4, "菜單4");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {//菜單選擇監(jiān)聽
switch (item.getItemId()) {
case 1:
Toast.makeText(MainActivity.this, "菜單一被選擇了", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(MainActivity.this, "菜單二被選擇了", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(MainActivity.this, "菜單三被選擇了", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(MainActivity.this, "菜單四被選擇了", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {//菜單打開事件監(jiān)聽
Toast.makeText(MainActivity.this, "選項菜單開啟", Toast.LENGTH_SHORT).show();
return super.onMenuOpened(featureId, menu);
}
@Override
public void onOptionsMenuClosed(Menu menu) {//菜單關(guān)閉事件監(jiān)聽
super.onOptionsMenuClosed(menu);
Toast.makeText(MainActivity.this, "選項菜單關(guān)閉", Toast.LENGTH_SHORT).show();
}
}
這里采用了動態(tài)添加的方式,調(diào)用了Menu類的add方法,如下: public MenuItem add(int groupId, int itemId, int order, CharSequence title); add方法中需要傳入四個參數(shù):
菜單選擇事件監(jiān)聽通過傳入的MenuItem對象,并調(diào)用其getItemId來判斷哪一個子菜單被選擇了。
運(yùn)行項目實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-4.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-5.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-6.png" alt="這里寫圖片描述" />
點(diǎn)擊選項菜單按鈕時,選項菜單彈出,選項菜單開啟事件觸發(fā),選擇菜單二,選擇事件觸發(fā),選擇完成后,菜單自動關(guān)閉,這時選項菜單關(guān)閉事件觸發(fā)。
細(xì)心的讀者會發(fā)現(xiàn),上面的實(shí)例中設(shè)置了子菜單的圖標(biāo),但是并沒有顯示,原因是在Android2.3以上的版本的源碼進(jìn)行了改變,若要想顯示圖標(biāo)可以通過修改源碼實(shí)現(xiàn),這一方法可以參考博文:http://blog.csdn.net/stevenhu_223/article/details/9705173。我們這里給出一個自定義彈出框的形式來實(shí)現(xiàn)更美觀的菜單選項。
彈出框布局文件(view.xml) 彈出框布局采用GridView控件進(jìn)行布局,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<GridView
android:id="@+id/gridview"
android:layout_width="300dp"
android:layout_height="150dp"
android:gravity="center"
android:numColumns="3" />
</LinearLayout>
GridView子布局文件(item.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout_Item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerHorizontal="true"></ImageView>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/iv_icon"
android:layout_centerHorizontal="true"
android:text="選項"></TextView>
</RelativeLayout>
MainActivity代碼(MainActivity.java)
public class MainActivity extends Activity {
private AlertDialog alertDialog;
private GridView gridView;
private View view;
private int[] icons = {R.drawable.exit, R.drawable.fold, R.drawable.set, R.drawable.newpic, R.drawable.more};
private String[] titles = {"退出", "文件", "設(shè)置", "新建", "更多"};
private SimpleAdapter simpleAdapter;
private List<Map<String, Object>> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = LayoutInflater.from(this).inflate(R.layout.view, null);//獲得彈出框布局文件對象
initDatas();//初始化數(shù)據(jù)集
//初始化SimpleAdapter
simpleAdapter = new SimpleAdapter(this, datas, R.layout.item, new String[]{"icon", "title"}, new int[]{R.id.iv_icon, R.id.tv_title});
alertDialog=new AlertDialog.Builder(this).create();//創(chuàng)建彈出框
alertDialog.setView(view);//設(shè)置彈出框布局
gridView=(GridView)view.findViewById(R.id.gridview);
gridView.setAdapter(simpleAdapter);//設(shè)置適配器
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//GridView子項單擊事件監(jiān)聽
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this,"您點(diǎn)擊了"+titles[position]+"按鈕",Toast.LENGTH_SHORT).show();
alertDialog.dismiss();
}
});
}
private void initDatas() {
datas = new ArrayList<>();
for (int i = 0; i < titles.length; i++) {
Map map = new HashMap();
map.put("icon", icons[i]);
map.put("title", titles[i]);
datas.add(map);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//覆寫了onKeyDown方法
if(keyCode==KeyEvent.KEYCODE_MENU){//當(dāng)按下菜單鍵時
if (alertDialog == null) {
alertDialog = new AlertDialog.Builder(this).setView(view).show();
} else
alertDialog.show();
}
return super.onKeyDown(keyCode, event);
}
}
這里覆寫了onKeyDown方法,當(dāng)菜單鍵按下時,彈出對話框,對話框布局采用了GridView控件,設(shè)置了GridView子項單擊事件監(jiān)聽,處理對于邏輯。SimpleAdapter適配器類初始化時要傳入五個參數(shù),不熟悉的讀者可以參考前面的GridView章節(jié)。
運(yùn)行實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-7.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-8.png" alt="這里寫圖片描述" />
點(diǎn)擊設(shè)置按鈕,彈出對話菜單選擇框,選擇對應(yīng)的子菜單對應(yīng)不同的邏輯操作。