Android功能表項目內容大全,android功能表項目大全

來源:互聯網
上載者:User

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;    }});

  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.