Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Composite(Menu)詳解

Android Composite(Menu)詳解

編輯:關於Android編程

目錄:
1.Menu概述
2.Menu的一些常用屬性
3.Menu分類
3.1 選項菜單(Option Menu)
3.2 上下文菜單(Context Menu)
3.3 彈出菜單(Popup Menu)
3.4 子菜單(Sub Menu)

1.Menu概述
Menu的樣子和作用我想沒有必要在說,通常我們在使用App的過程中都有見過它,有從底部彈出的,長按彈出的等等,不過底部彈出。菜單有被Actionbar overflow替換的趨勢,因為底部菜單的調用需要設備硬件盤的Menu按鍵來調用,而在設備更迭中大多數設備已經棄掉了硬件盤的Menu按鍵。

2.Menu的一些常用屬性

    android:title="":設置菜單項的title
    android:icon="":設置菜單項的icon
    android:alphabeticShortcut="":字母快捷鍵
    android:numericShortcut="":數字快捷鍵
    android:checked="":設置菜單項是否被選中
    android:checkable="":設置菜單項是否能選中
    android:enabled="":設置菜單項是否可用
    android:visible="":設置菜單項是否見
    android:orderInCategory="1":設置菜單項順序
    android:showAsAction="always|ifRoom|withText|never":設置菜單項在anctionbar中是否放入overflow

3.Menu分類
3.1 選項菜單(Option Menu)
1)概述
選項菜單有被Actionbar overflow替代的趨勢,他的調用主要是通過物理鍵盤的Menu鍵去調用,通常從設備的底部彈出,選項主要
是一些全局的操作。

2)Option menu代碼實現(該方法不符合邏輯代碼與UI顯示的低耦合,讓我們的代碼特別的臃腫,所以不推薦使用)

    package com.example.menu;

    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        /*
        * 創建選項菜單
        * */
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            /*參數:
             *   1、組別:如果不分組的話就寫Menu.NONE,
             *
             *   2、Id: Android根據這個Id來確定不同的菜單
             *
             *   3、順序:那個菜單現在在前面由這個參數的大小決定
             *
             *   4、文本: 菜單的顯示文本
             */

            menu.add(Menu.NONE, Menu.FIRST + 1, 1, "刪除").setIcon(

                    android.R.drawable.ic_menu_delete);

            menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(

                    android.R.drawable.ic_menu_edit);

            menu.add(Menu.NONE, Menu.FIRST + 3, 3, "幫助").setIcon(

                    android.R.drawable.ic_menu_help);

            menu.add(Menu.NONE, Menu.FIRST + 4, 4, "添加").setIcon(

                    android.R.drawable.ic_menu_add);

            menu.add(Menu.NONE, Menu.FIRST + 5, 5, "詳細").setIcon(

                    android.R.drawable.ic_menu_info_details);

            menu.add(Menu.NONE, Menu.FIRST + 6, 6, "發送").setIcon(

                    android.R.drawable.ic_menu_send);

            return true;

        }

        /*
        * 選項選擇監聽
        * */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case Menu.FIRST+1:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+2:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+3:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+4:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+5:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+6:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
            }
            return super.onOptionsItemSelected(item);
        }
    }


3)Option menu xml實現(直觀便於修改管理,推薦使用此方法創建)
(3.1)MainActivity.java
    package com.example.menu;

    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }

        public boolean onCreateOptionsMenu(Menu menu) {

            //通過xml定義的menu
            getMenuInflater().inflate(R.menu.option_menu,menu);
            //返回true設置的菜單才會生效,這裡super.onCreateOptionsMenu(menu)調用父類方法返回true
            return true;
        }
        /*
        * 選項選擇監聽
        * */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
            return super.onOptionsItemSelected(item);
        }

    }

(3.2)option_menu.xml


4)效果截圖
\
3.2 上下文菜單(Context Menu)
1)概述:
上下文菜單通常在UI中對某些特點資源執行一些操作,比如:刪除、置頂、復制、收藏等等,都可以通過上下文菜單作為顯示注冊
到某個控件上,同時Context Menu通常通過長點擊某個控件調出。

2)簡單使用
(2.1)COntextMenuActivity.java
package com.example.menu;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by elimy on 2016-09-01.
 */
public class ContextMenuActivity extends AppCompatActivity {
    ArrayList arrayList = new ArrayList();
    ArrayAdapter adapter;
    ListView listView ;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.context_menu_activity);
        //初始化listview
        listView = (ListView) findViewById(R.id.context_menu_lv);
        //初始化數組
        for (int i=0;i<10;i++){
            arrayList.add("數據"+i);
        }
        //初始化adapter
        adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,android.R.id.text1,arrayList);
        //設置適配器
        listView.setAdapter(adapter);
        //注冊上下文菜單
        registerForContextMenu(listView);

    }
    /*
    * 創建選項菜單方法
    * */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //聲明並初始化menu布局加載器
        MenuInflater  inflater= getMenuInflater();
        //適配加載定義的menu xml
        inflater.inflate(R.menu.context_menu,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        Toast.makeText(ContextMenuActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
        return super.onContextItemSelected(item);
    }
}


(2.2)context_menu.xml



(2.3)context_menu_activity.java



    
  

(2.4)效果截圖
\
3.3 彈出菜單(Popup Menu)

1)概述:
Popup Menu與Popup window類似,他需要依附於某個View之上,通常menu顯示於View下方。

2)Actionbar通過Popup menu實現彈出菜單,與overflow菜單類似
(2.1)隱藏Actionbar,准備使用toolbar

        
            
                

                
            
           

(2.2)主布局文件popup_menu_activity.xml



  
    
  
    



(2.3)菜單項布局文件popup_menu.xml



(2.4)主布局java類PopMenuActivity.java
package com.example.menu;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.internal.view.menu.MenuBuilder;
import android.support.v7.internal.view.menu.MenuPopupHelper;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by elimy on 2016-09-01.
 */
public class PopMenuActivity extends AppCompatActivity {
    PopupMenu popupMenu;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pop_menu_activity);
        //聲明並初始化
        final ImageView imageView = (ImageView) findViewById(R.id.menu_iv);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        //toolbar設置標題
        toolbar.setTitle("彈出自定義菜單");
        //設置title顏色
        toolbar.setTitleTextAppearance(PopMenuActivity.this,R.style.Theme_Toolbar_Title);
        //設置顯示toolbar
        setSupportActionBar(toolbar);
        //為圖片設置監聽
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //初始化PopupMenu
                popupMenu = new PopupMenu(PopMenuActivity.this,imageView);
                //通過menu布局加載器適配菜單
                getMenuInflater().inflate(R.menu.pop_menu,popupMenu.getMenu());
                try {
                    //通過反射獲取PopupMenu類的mPopup成員變量
                    Field field = popupMenu.getClass().getDeclaredField("mPopup");
                    //設置為可接近,可訪問,因為mPopup在PopupMenu類中為私有屬性
                    field.setAccessible(true);
                    //通過屬性get方法獲取屬性的類MenuPopupHelper的類對象
                    MenuPopupHelper menuPopupHelper = (MenuPopupHelper) field.get(popupMenu);
                    //設置強制顯示icon
                    menuPopupHelper.setForceShowIcon(true);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                //顯示popupMenu
                popupMenu.show();
                //設置監聽器
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(PopMenuActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                        return false;
                    }
                });
            }
        });
    }
}  


(2.5)效果截圖
\
3.4 子菜單(Sub Menu)

1)概述:
子菜單即菜單項下的菜單,比如某個操作的子操作有很多,像文件操作,子操作有文件新建,復制,剪切等等

2)簡單使用
    package com.example.menu;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;

/**
 * Created by elimy on 2016-09-02.
 */
public class SubMenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub_menu_activity);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        SubMenu share =menu.addSubMenu("分享");
        SubMenu edit = menu.addSubMenu("編輯");
        SubMenu file = menu.addSubMenu("文件");
        share.add(0,Menu.FIRST,1,"分享到微信");
        share.add(0,Menu.FIRST+1,2,"分享到微博");
        //去掉子菜單頭部
        //share.clearHeader();
        //設置父選項圖標,需要強制顯示才能看到
        //share.setIcon(R.drawable.share_24);
        //設置子選項頭部顯示圖標
        //share.setHeaderIcon(R.drawable.share_24);
        edit.add(0,Menu.FIRST+2,0,"復制");
        edit.add(0,Menu.FIRST+3,1,"剪切");
        file.add(0,Menu.FIRST+4,1,"打開");
        file.add(0,Menu.FIRST+5,2,"新建");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case Menu.FIRST:
                Toast.makeText(SubMenuActivity.this,"點擊了分享到微信",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+1:
                Toast.makeText(SubMenuActivity.this,"點擊了分享到微博",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+2:
                Toast.makeText(SubMenuActivity.this,"點擊了復制",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+3:
                Toast.makeText(SubMenuActivity.this,"點擊了剪切",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+4:
                Toast.makeText(SubMenuActivity.this,"點擊了打開",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+5:
                Toast.makeText(SubMenuActivity.this,"點擊了新建",Toast.LENGTH_SHORT).show();
                break;

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