Tag標籤:Android
-
1. 爲什麼會有菜單菜單一般是提供一些設置或是軟件信息什麼的,移動設備的屏幕不像PC那麼大,不可能在屏幕搞一些按鍵來觸發一些平時使用不會經常操作的事件,比如設置軟件配置,查看軟件信息什麼的。這些功能可以添加到菜單選項中,既提供了該功能,又不會佔用屏幕空間。(純屬扯淡有木有啊!!!因爲我實在想不出要以什麼開頭寫這篇總結)2. 菜單的不同創建方法2.1 動態創建通過重寫Activity中的onCreateOptionMenu方法來創建菜單,一般使用menu.add(“選項名”)爲添加一個菜單選項,menu.getItem(int itemIndex)則是根據選項的索引獲取該菜單選項,並對其進行操作,比如添加點擊事件onMenuItemClickListener,用addSubMenu添加子菜單等。優點:創建方便,不需要建立資源文件。缺點:對於菜單條目過多或多級菜單操作不方便,按鍵多添加點擊事件不方便。2.2 通過XML資源文件創建可以通過menu文件夾下的menu.xml創建菜單的樣式,然後再利用getMenuInflater().inflate(menuRes, menu)將創建的菜單樣式inflate到程序中。大體主要分三步:第一步:建立XML資源文件:menu.xml文件一般的定義方式見如下:
01.
<?
xmlversion
xmlversion
=
"1.0"
encoding
=
"utf-8"
?>
02.
<
menuxmlns:android
menuxmlns:android
=
"http://schemas.android.com/apk/res/android"
>
03.
<
itemandroid:id
itemandroid:id
=
"@+id/file"
04.
android:title
=
"@string/file"
>
05.
<!-- "file" submenu 添加子菜單 -->
06.
<
menu
>
07.
<!-- 子菜單的選項 -->
08.
<
itemandroid:id
itemandroid:id
=
"@+id/create_new"
09.
android:title
=
"@string/create_new"
/>
10.
<
itemandroid:id
itemandroid:id
=
"@+id/open"
11.
android:title
=
"@string/open"
/>
12.
</
menu
>
13.
</
item
>
14.
</
menu
>
第二步:在onCreateOptionMenu回調函數完成XML資源的infate,把菜單資源文件壓入到程序中,不同菜單使用不同的回調函數,比如ContextMenu使用onCreateContextMenu:
1.
publicbooleanonCreateOptionsMenu(Menu menu) {
2.
// Inflate the menu; this adds items to the action bar if it is present.
3.
getMenuInflater().inflate(R.menu.main, menu);
4.
returntrue;
5.
}
第三步:如果我們需要給菜單添加點擊事件,一般我們是通過重寫onMenuItemSelected來設置的,不同菜單使用不同的點擊回調函數,比如ContextMenu使用onContextItemSelected寫法如下:
01.
publicbooleanonMenuItemSelected(intfeatureId, MenuItem item) {
02.
switch
(item.getItemId()) {
03.
caseItem.ID1:
04.
//do something
05.
break
;
06.
caseItem.ID2:
07.
//do something
08.
break
;
09.
//......
10.
}
11.
returnsuper.onMenuItemSelected(featureId, item);
12.
}
3. 菜單的類型:3.1 普通菜單:一般的普通菜單,點擊菜單鍵後顯示出來的菜單,使用方法如第二點所述,只是設置item標籤時把showAsAction值設爲never即可。3.2 顯示在ActionBar的菜單:這樣的菜單可以直接從屏幕中看到,不需要點擊菜單鍵纔會顯示,要做到這個只需要把Item的showAsAction從never改成ifRoom(如果有空間則顯示)或always(總是顯示)。例子如下;
01.
<
menuxmlns:android
menuxmlns:android
=
"http://schemas.android.com/apk/res/android"
>
02.
<
item
03.
android:id
=
"@+id/info"
04.
android:orderInCategory
=
"100"
05.
android:showAsAction
=
"never"
06.
android:title
=
"軟件信息"
>
07.
<
menu
>
08.
<
itemandroid:id
itemandroid:id
=
"@+id/authorInfo"
09.
android:title
=
"軟件開發者信息"
/>
10.
<
itemandroid:id
itemandroid:id
=
"@+id/versionInfo"
11.
android:title
=
"軟件版本信息"
/>
12.
</
menu
>
13.
</
item
>
14.
<!-- 建立一個在Action的菜單選項 -->
15.
<
item
16.
android:id
=
"@+id/settings"
17.
android:orderInCategory
=
"100"
18.
android:showAsAction
=
"always"
19.
android:icon
=
"@drawable/ic_launcher"
>
20.
<
menu
>
21.
<
itemandroid:id
itemandroid:id
=
"@+id/sysSetting"
22.
android:title
=
"系統設置"
/>
23.
<
itemandroid:id
itemandroid:id
=
"@+id/softSetting"
24.
android:title
=
"軟件設置"
/>
25.
</
menu
>
26.
</
item
>
27.
</
menu
>
效果圖:3.3 浮動菜單(屬於ContextMenu):一般添加到ListView或GridView的菜單,長按菜單的某一項可以出發浮動菜單,定義這種菜單主要步驟如下:1、建立一個View,常用的爲ListView或GridView;2、建立XML菜單資源文件;3、在Activity中的onCreateContextMenu函數中使用getMenuInflater().inflate()方法將XML菜單資源文件壓入;4、在onContextItemSelected回調函數中添加菜單選項的點擊事件。5、使用registerForContextMenu(View)爲該View註冊ContextMenu;源碼示例如下:
01.
privateListView list;
02.
@Override
03.
protectedvoidonCreate(Bundle savedInstanceState) {
04.
super
.onCreate(savedInstanceState);
05.
setContentView(R.layout.activity_main);
06.
String[] listItem = {
"1"
,
"2"
,
"3"
,
"4"
,
"5"
};
07.
ArrayAdapter<String> aa = newArrayAdapter<String>(
this
,
08.
android.R.layout.simple_list_item_1, listItem);
09.
list = (ListView) findViewById(R.id.list);
10.
list.setAdapter(aa);
11.
registerForContextMenu(list);
12.
//爲list註冊上下文菜單,通過onCreateContextMenu把XML菜單資源文件壓進來,
13.
//通過onContextItemSelectd爲每個菜單選項添加長按點擊事件。
14.
}
15.
@Override
16.
publicvoidonCreateContextMenu(ContextMenu menu, View v,
17.
ContextMenuInfo menuInfo) {
18.
super
.onCreateContextMenu(menu, v, menuInfo);
19.
getMenuInflater().inflate(R.menu.float_menu, menu);
20.
}
21.
@Override
22.
publicbooleanonContextItemSelected(MenuItem item) {
23.
switch
(item.getItemId()) {
//判斷長按點擊了那個選項,爲每個選項添加長按點擊事件
24.
caseR.id.exit:
25.
showToast(
"exit"
);
26.
break
;
27.
caseR.id.next:
28.
showToast(
"next"
);
29.
break
;
30.
caseR.id.back:
31.
showToast(
"back"
);
32.
break
;
33.
}
34.
returnsuper.onContextItemSelected(item);
35.
}
36.
privatevoidshowToast(String str) {
37.
Toast.makeText(MainActivity.
this
, str, Toast.LENGTH_SHORT).show();
38.
}
效果圖:3.4 ActionMode菜單(也屬於ContextMenu):顯示在ActionBar的菜單,這種菜單是用於定義比較重要或常用的功能,放在ActionBar比較顯眼。觸發這種菜單跟浮動菜單一樣,要長按,浮動菜單直接採用註冊方法,而該菜單則需要我們去設置View的長按事件(setOnLongClickListener)。使用方法:1、建立XML菜單資源文件;2、建立一個內部類實現ActionMode.Callback接口,實現該接口的四個函數(onCreateActionMode,onPrepareActionMode,onActionItemClicked,onDestroyActionMode)3、在onCreateActionMode把XML文件壓進來,而且返回true!4、在onActionItemClicked中添加菜單選項點擊事件;5、建立一個View,以Button爲例,添加OnLongClickListener事件,事件內容爲startActionMode(實現Callback接口的類);源代碼示例:(1)XML資源文件:
01.
<
LinearLayoutxmlns:android
LinearLayoutxmlns:android
=
"http://schemas.android.com/apk/res/android"
02.
xmlns:tools
=
"http://schemas.android.com/tools"
03.
android:layout_width
=
"match_parent"
04.
android:layout_height
=
"match_parent"
05.
android:paddingBottom
=
"@dimen/activity_vertical_margin"
06.
android:paddingLeft
=
"@dimen/activity_horizontal_margin"
07.
android:paddingRight
=
"@dimen/activity_horizontal_margin"
08.
android:paddingTop
=
"@dimen/activity_vertical_margin"
09.
android:orientation
=
"vertical"
10.
tools:context
=
".MenuActivity2"
>
11.
<
Button
12.
android:id
=
"@+id/btn_actionMode"
13.
android:layout_width
=
"match_parent"
14.
android:layout_height
=
"wrap_content"
15.
android:text
=
"打開ActionMode菜單"
/>
16.
<
Button
17.
android:id
=
"@+id/btn_popUp"
18.
android:layout_width
=
"match_parent"
19.
android:layout_height
=
"wrap_content"
20.
android:text
=
"打開PopUp菜單"
/>
21.
</
LinearLayout
>
(2)實現Callback的Java代碼:
01.
privateclasscallback implementsActionMode.Callback {
02.
@Override
03.
publicbooleanonActionItemClicked(ActionMode mode, MenuItem item) {
04.
switch
(item.getItemId()) {
05.
caseR.id.user_info:
06.
Toast.makeText(MenuActivity2.
this
,
"You click user_info"
,
07.
Toast.LENGTH_SHORT).show();
08.
returntrue;
09.
caseR.id.user_setting:
10.
Toast.makeText(MenuActivity2.
this
,
"You click user_setting"
,
11.
Toast.LENGTH_SHORT).show();
12.
returntrue;
13.
caseR.id.user_login:
14.
Toast.makeText(MenuActivity2.
this
,
"You click user_login"
,
15.
Toast.LENGTH_SHORT).show();
16.
returntrue;
17.
default
:
18.
returnfalse;
19.
}
20.
}
21.
@Override
22.
publicbooleanonCreateActionMode(ActionMode mode, Menu menu) {
23.
getMenuInflater().inflate(R.menu.menu_activity2, menu);
24.
returntrue;
25.
}
26.
@Override
27.
publicvoidonDestroyActionMode(ActionMode mode) {
28.
Log.i(
"cth"
,
"ActionMode is destroyed."
);
29.
actionMode =
null
;
30.
}
31.
@Override
32.
publicbooleanonPrepareActionMode(ActionMode mode, Menu menu) {
33.
returnfalse;
34.
}
35.
}
(3)長按事件Java代碼:
01.
btn_actionMode = (Button) findViewById(R.id.btn_actionMode);
02.
btn_actionMode.setOnLongClickListener(newOnLongClickListener() {
//添加長按事件
03.
@Override
04.
publicbooleanonLongClick(View v) {
05.
if
(actionMode !=
null
) {
06.
returnfalse;
07.
}
08.
actionMode = startActionMode(newcallback());
//開啓ActionMode菜單
09.
v.setSelected(
true
);
//設置爲可選
10.
returntrue;
11.
}
12.
});
效果圖(紅框即爲ActionMode菜單):3.5 Popup彈出菜單:該類菜單需要和某個View綁定,當點擊該View時在該View的上面或下面(視屏幕空間而定)彈出菜單。使用方法:1、建立XML菜單資源文件;2~5步均可在綁定View的點擊事件中實現!2、建立PopupMenu對象,實例化傳入上下文context和綁定的View;3、使用PopupMenu對象的getMenuInflater().inflate()把XML菜單文件壓進來,4、使用PopupMenu對象自身的setOnMenuItemClickListener設置點擊事件;5、使用PopupMenu對象自身的show顯示彈出菜單。源代碼示例:(1)在View的點擊事件中設置2~5步內容:
01.
btn_popUp = (Button) findViewById(R.id.btn_popUp);
02.
btn_popUp.setOnClickListener(newOnClickListener() {
03.
@TargetApi
(Build.VERSION_CODES.HONEYCOMB)
04.
@SuppressLint
(
"NewApi"
)
05.
@Override
06.
publicvoidonClick(View v) {
07.
PopupMenu popup = newPopupMenu(MenuActivity2.
this
, v);
//建立PopupMenu對象
08.
popup.getMenuInflater().inflate(R.menu.menu_activity2,
//壓入XML資源文件
09.
popup.getMenu());
10.
popup.setOnMenuItemClickListener(MenuActivity2.
this
);
//設置點擊菜單選項事件
11.
popup.show();
//顯示菜單
12.
}
13.
});
(2)點擊事件
01.
@Override
02.
publicbooleanonMenuItemClick(MenuItem item) {
03.
switch
(item.getItemId()) {
04.
caseR.id.user_info:
05.
Toast.makeText(MenuActivity2.
this
,
"You click user_info"
,
06.
Toast.LENGTH_SHORT).show();
07.
returntrue;
08.
caseR.id.user_setting:
09.
Toast.makeText(MenuActivity2.
this
,
"You click user_setting"
,
10.
Toast.LENGTH_SHORT).show();
11.
returntrue;
12.
caseR.id.user_login:
13.
Toast.makeText(MenuActivity2.
this
,
"You click user_login"
,
14.
Toast.LENGTH_SHORT).show();
15.
returntrue;
16.
default
:
17.
returnfalse;
18.
}
19.
}
效果圖:4. 總結:菜單主要分兩種,OptionMenu和ContextMenu,只有浮動菜單(floating menu)和ActionMode菜單爲ContextMenu。OptionMenu建立菜單的方法爲在onCreateOptionMenu中inflate XML文件,在onMenuItemClick中設置點擊事件(PopupMenu使用自身的setOnMenuItemClickListener設置),ContextMenu建立菜單的方法爲在onCreateContextMenu中inflate XML文件(ActionMode在Callback中),在onContextItemClick中設置點擊事件。