菜單

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.<?xmlversionxmlversion="1.0"encoding="utf-8"?>
    02.<menuxmlns:androidmenuxmlns:android="http://schemas.android.com/apk/res/android">
    03.<itemandroid:iditemandroid:id="@+id/file"
    04.android:title="@string/file">
    05.<!-- "file" submenu 添加子菜單 -->
    06.<menu>
    07.<!-- 子菜單的選項 -->
    08.<itemandroid:iditemandroid:id="@+id/create_new"
    09.android:title="@string/create_new"/>
    10.<itemandroid:iditemandroid: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:androidmenuxmlns: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:iditemandroid:id="@+id/authorInfo"
    09.android:title="軟件開發者信息"/>
    10.<itemandroid:iditemandroid: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:iditemandroid:id="@+id/sysSetting"
    22.android:title="系統設置"/>
    23.<itemandroid:iditemandroid: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:androidLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    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中設置點擊事件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章