Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android菜單項內容大全,android菜單項大全

Android菜單項內容大全,android菜單項大全

編輯:關於android開發

Android菜單項內容大全,android菜單項大全


一、介紹:

菜單是許多應用中常見的用戶界面組件。

Android3.0版本以前,Android設備會提供一個專用“菜單”按鈕呈現常用的一些用戶操作,

Android3.0版本以後,取而代之的是提供一個操作欄來完成“菜單”的功能

關於菜單的官方介紹:<https://developer.android.com/guide/topics/ui/menus.html>

二、分類:

1、OptionsMenu(選項菜單)

              

Android 2.3.X或更低版本                   Android3.0及更高版本

 

Android 2.3.X或更低版本,當用戶按“菜單”按鈕(實體按鈕)時,選項菜單的內容會出現在屏幕底部;

Android3.0及更高版本,則選項菜單中的項目將出現在操作欄中。默認情況下,系統會將所有項目均放入操作溢出菜單中。用戶可以使用操作欄右側的操作溢出菜單圖標(或者,通過按設備“菜單”按鈕(如有))顯

示操作溢出菜單。但是可以通過在tem中android:showAsAction = “ifRoom”將菜單選項直接提升到操作欄中去顯示。

*:並不是所有的app都會有菜單出現在操作欄中的,這取決於app的設計,如果app是需要自己的操作欄,那麼根據自己的需求設計,如果是系統默認的操作欄,那麼就會有菜單。

  ---通過重寫 onCreateOptionsMenu()創建選項菜單,您可以將菜單資源(使用 XML 定義)擴充到回調中提供的 Menu 中:

  Eg:

 

  public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);
     //add新增菜單
     menu.add("新增選項菜單");
     //效果一樣,都直接加的一級菜單
     menu.addSubMenu("新增選項菜單子菜單");
     //查詢修改屬性
     menu.findItem(R.id.action_settings).setTitle("設置");
     return true;
  }

 

  ---處理點擊事件:用戶從選項菜單中選擇項目(包括操作欄中的操作項目)時,系統將調用 Activity 的 onOptionsItemSelected() 方法。此方法將傳遞所選的 MenuItem。您可以通過調用 getItemId() 方法來

識別項目,該方法將返回菜單項的唯一 ID,您可以將此 ID 與已知的菜單項匹配,以執行適當的操作。

  Eg:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

2、ContextMenu(上下文菜單)

上下文菜單提供了許多操作,這些操作影響 UI 中的特定項目或上下文框架。您可以為任何視圖提供上下文菜單,但這些菜單通常用於 ListView、GridView 或用戶可直接操作每個項目的其他視圖集合中的項目。

Android系統提供上下文操作的方法有2種:

(1)使用浮動上下文菜單

用戶長按(按住)一個聲明支持上下文菜單的視圖時,菜單顯示為菜單項的浮動列表(類似於對話框)。 用戶一次可對一個項目執行上下文操作。比如:

創建浮動上下文菜單步驟:

1、通過調用 registerForContextMenu(),綁定菜單給具體的view。如果view是listview或者gridview,那麼菜單將綁定給所有item。

2、在 Activity 中實現 onCreateContextMenu() 方法。
  當注冊後的視圖收到長按事件時,系統將調用您的 onCreateContextMenu() 方法。在此方法中,您通常可通過擴充菜單資源來定義菜單項。比如:

3、實現 onContextItemSelected()。用戶選擇菜單項時,系統將調用此方法,以便您能夠執行適當的操作。 例如:

  public boolean onContextItemSelected(MenuItem item) {
     switch (item.getItemId()) {
     case R.id.context_menu_1:
       Toast.makeText(getApplicationContext(), "選擇菜單1,你要做什麼,自己做...", 0).show();
       return true;
     default:
       return super.onContextItemSelected(item);
     }
  }
(2) 使用上下文操作模式

將在屏幕頂部顯示上下文操作欄,其中包括影響所選項的操作項目。當此模式處於活動狀態時,用戶可以同時對多項執行操作(如果應用允許)。比如:

創建上下文操作模式菜單步驟:

A:為單個視圖啟用上下文操作模式

1:實現ActionMode.Callback接口。在其回調方法中,您既可以為上下文操作欄指定操作,又可以響應操作項目的點擊事件。

2:當需要顯示操作欄時(例如,用戶長按視圖),調用startActionMode()。比如:

 

 private ActionMode.Callback  mActionModeCallback = new ActionMode.Callback() {
   
   /**
    * onCreateActionMode()之後調用,返回false表示什麼也不做。
    */
   @Override
   public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
     return false;
   }
   @Override
   public void onDestroyActionMode(ActionMode mode) {
     //方便內存回收
     actionMode = null;
   }
   
   /**
    * 當actionmode被創建,startActionMode()方法被調用,回調此方法
    * 在這裡可以為上下文操作模式綁定菜單
    */
   @Override
   public boolean onCreateActionMode(ActionMode mode, Menu menu) {
     MenuInflater menuInflater = mode.getMenuInflater();
     menuInflater.inflate(R.menu.context_menu, menu);
     return true;
   }
   
   /**
    * 當actionMode綁定的上下文菜單被點擊的時候的回調
    */
   @Override
   public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
     switch (item.getItemId()) {
     case R.id.context_menu_1:
        //選中菜單1,我就把button2的文字改一下好了..
        button2.setText(item.getTitle());
        //完成菜單的任務之後,最好銷毀一下actionMode對象,不要長期占用內存
        actionMode.finish();
        return true;
     default:
        return false;
     }
   }
};

B:在 ListView 或 GridView 中有一組項目(或 AbsListView 的其他擴展),且需要允許用戶執行批處理操作。

步驟:
1:使用 setMultiChoiceModeListener()設置AbsListView.MultiChoiceModeListener 接口的實現類對象。
2:使用 setChoiceMode()設置選擇模式為 CHOICE_MODE_MULTIPLE_MODAL;

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

Eg:

lv = (ListView) findViewById(R.id.lv);
     strings = new ArrayList<String>();
     strings.add("item1");
     strings.add("item2");
     strings.add("item3");
 
     adapter = new ArrayAdapter<String>(this,
          android.R.layout.simple_list_item_1, strings);
     lv.setAdapter(adapter);
     // 設置上下文操作模式
     lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
     lv.setMultiChoiceModeListener(new MultiChoiceModeListener() {
 
       @Override
       public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
          return false;
       }
 
       @Override
       public void onDestroyActionMode(ActionMode mode) {
 
       }
 
       @Override
       public boolean onCreateActionMode(ActionMode mode, Menu menu) {
          MenuInflater menuInflater = mode.getMenuInflater();
          menuInflater.inflate(R.menu.context_menu, menu);
          return true;
       }
 
       @Override
       public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
          Log.v("zoubo", "onActionItemClicked..");
          switch (item.getItemId()) {
          case R.id.context_menu_1:
            // 選中菜單1,新增一個item
            strings.add("item4");
            adapter.notifyDataSetChanged();
            // 局部的mode,不需要維護其生命周期
            // mode.finish();
            return true;
          default:
            return false;
          }
       }
 
       /**
        * item選中狀態發生改變時調用
        */
       @Override
       public void onItemCheckedStateChanged(ActionMode mode,
            int position, long id, boolean checked) {
          Log.v("zoubo", "onItemCheckedStateChanged..");
       }
     });

*:現在,當用戶通過長按選擇項目時,系統即會調用 onCreateActionMode() 方法,並顯示包含指定操作的上下文操作欄。

在某些情況下,如果上下文操作提供常用的操作項目,則您可能需要添加一個復選框或類似的 UI 元素來支持用戶選擇項目,這是因為他們可能沒有發現長按行為。

用戶選中該復選框時,您可以通過使用 setItemChecked() 將相應的列表項設置為選中狀態,以此調用上下文操作模式。

2、PopupMenu(彈出式菜單)

錨定到 View 的模態菜單。如果空間足夠,它將顯示在定位視圖下方,否則顯示在其上方。

一般會在如下場景使用到它:

與特定內容確切相關的操作提供溢出樣式菜單,(例如,Gmail 的電子郵件標頭)

提供命令語句的另一部分(例如,標記為“添加”且使用不同的“添加”選項生成彈出菜單的按鈕)

提供類似於 Spinner 且不保留永久選擇的下拉菜單。

Eg:

ImageView iv1 = (ImageView) findViewById(R.id.iv1);
     iv1.setOnClickListener(new OnClickListener() {
       
       @Override
       public void onClick(View v) {
          PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);
          MenuInflater menuInflater = popupMenu.getMenuInflater();
          menuInflater.inflate(R.menu.popup_menu, popupMenu.getMenu());
          popupMenu.show();
          popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            
            @Override
            public boolean onMenuItemClick(MenuItem item) {
               switch (item.getItemId()) {
               case R.id.popup_menu_1:
                 return true;
               default:
                 return false;
               }
            }
          });
       }
     });

PopupWindow:

PopupWidow提供實現自定義菜單的原生控件,它可以指定自己繪制的view對象作為彈出菜單錨定出現在view的周圍,並且可以控制它具體出現的位置

Eg:

Button btn3 = (Button) findViewById(R.id.btn3);
     btn3.setOnClickListener(new OnClickListener() {
 
       @Override
       public void onClick(View v) {
          // TODO Auto-generated method stub
          View contentView = LayoutInflater.from(v.getContext()).inflate(
               R.layout.popup_menu, null);
          PopupWindow popupWindow = new PopupWindow(contentView,
               LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          // 出現view的下方
          // popupWindow.showAsDropDown(v);
          // 如果不設置PopupWindow的背景,無論是點擊外部區域還是Back鍵都無法dismiss彈框
          popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.q2));
          popupWindow.setOutsideTouchable(true);
          popupWindow.showAtLocation(v, Gravity.TOP, (int) v.getX(),(int) v.getY());
       }
     });

*:代碼中,如果需要點擊外部讓popupwindow消失的話,必須調用這2句代碼:
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.q2));
popupWindow.setOutsideTouchable(true);

popupWindow遮罩效果的實現:
布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/ll"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#b0000000"
                android:orientation="vertical">
 
final PopupWindow popupWindow = new PopupWindow(inflate, RelativeLayout.LayoutParams.MATCH_PARENT,
        RelativeLayout
        .LayoutParams.WRAP_CONTENT);
 
//對於用戶的可視范圍之外的區域點擊,讓窗口消失的處理方式
inflate.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {

        int height = inflate.findViewById(tv).getTop();
        int y = (int) event.getY();
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (y < height) {
                popupWindow.dismiss();
            }
        }
        return true;
    }
});

  

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved