android基礎學習-android篇day16-Menu的使用

發條魚發表於2018-09-21

Menu 基礎知識

android提供的標準UI元件

  1. menu 的總體概述

  •  menu 是 android 的一個重要元件
  •  menu 選單是一款比較通用的使用者體驗的元件
  • 從 Android 3.0 即 API 11 之後 android 系統沒有提供單獨的選單按鈕

Menu 選單的分類

  1.  選項選單(Options Menu);當使用者觸發 menu 項時彈出的選單

  2.  上下文選單(Context Menu):使用者長按那個控制元件時彈出的類似對話方塊

  3. 彈出選單(Pop Menu),當使用者點選某個 View 檢視是彈出的選單

  • Menu 選單的使用

    1、使用 xml 檔案載入 menu

    Item 的屬性:android:id 唯一標識選單,android:title :選單項的文字

    android: orderInCategory:設定同種類選單項的排列順序

    android:showAsAction="never|ifroom|always" 表示是否顯示 寫好以後直接在程式碼中寫 getMenuInflator.inflate()載入進來即可

    (1).選項選單

  • 當使用者單擊裝置上的選單按鈕(Menu),觸發事件彈出的選單就是選項選單。選項選單最多隻有六個,超過六個第六個就會自動顯示 更多 選項來展示顯示。

  • 建立方法:

  1.  覆蓋 Activity 的 onCreateOptionsMenu(Menu menu)方法,當我們第一次開啟時呼叫。

  2.  呼叫 Menu 的 add()方法新增選單項(MenuItem),可以呼叫 MenuItem 的 setIcon()方法為選單項設定圖示。

  3. 當選單項(MenuItem)被選中時,覆蓋 Acitivy 的 onOptionsMenuSelected()方法響應事件。

(2)、上下文選單

當使用者長按 Activity 頁面時,彈出的選單我們稱為上下文選單。我們經常在 Windows 中用滑鼠右鍵單擊彈出的選單就是上下文選單。

  • 1) 覆蓋 Activity 的 onCreateContextMenu()方法,呼叫 Menu 的 add 方法新增選單項MenuItem
  • 2)  覆蓋 onContextItemSelected()方法,響應選單單擊事件

  • 3)  呼叫 registerForContextMenu()方法,為檢視註冊上下文選單

(3)子選單

子選單就是將相同功能的分組進行多級顯示的一種選單,比如,Windows 的“檔案”選單中就有“新建”,“開啟”,“關閉”等子選單。建立子選單的方法

  • 1)、覆蓋 Activity 的 onCreateOptionsMenu()方法,呼叫 Menu 的 addSubMenu()方法 新增子選單項
  • 2)、呼叫 SubMenu 的 add(),新增子選單項
  • 3)、覆蓋 onCreateItemSelected()方法,響應選單單擊事件

4. 使用程式碼的方式載入彈出選單

1) 在 Android 中使用程式碼載入選單使用的是 menu 的 add()方法,。2) add()方法的引數需要重點掌握

5. 選項選單的點選事件

選項選單的點選事件有三種分別是如下程式碼所示:
第一種對於使用 xml 載入選單的可以使用以下兩種方式來新增點選事件onOptionsItemSelect

第二種點選事件在繼承Activity類中 onMenuItemSelect

第三種點選事件對於那些使用程式碼載入的選單可以使用以下方式新增點選事件 onMenuItemClickListener

具體使用哪一種點選事件大家個根據你實現的功能來選擇

6. Menu 選單的巢狀使用規則

  • 1)  Item 中可以巢狀 menu,但是不能巢狀 group

  • 2)  Menu 中既可以巢狀 group,又可以巢狀 item。

  • 3)  Group 中只能巢狀 item,不能巢狀 menu

7. 上下文選單:

上下文選單是和某一種控制元件繫結使用的,也就是說每個控制元件只有註冊了上下文選單,並且長 按時彈出的選單就是上下文選單,

  •  呼叫 registerForContextMenu()方法,為檢視註冊上下文選單
  • 上下文選單載入選單是通過重寫 onCreateContextMenu()來完成的,
  • 上下文選單的 點選事件是通過重寫 onContextItemSelected()方法來實現的,具體程式碼如下

8.PopMenu:

  • 拿到選單項是通過建立 popMenu 的物件再通過選單載入器將其載入進來的
  • popMenu 的點選事件是通過 popMenu.setOnMenuItemClickListener()方法實現的。

實現程式碼如下:

寫完以後一定要注意 show(),否則不能看到

綜合案例:

 通過xml佈局檔案寫menu(推薦方法) main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
    item:選單內容
    title:選單標題
    orderInCategory:選單顯示順序
    -->
    <!--設定font_group 的子選單-->

    <item
        android:id="@+id/font_group"
        android:orderInCategory="1"
        android:title="@string/font_name">
        <menu>
            <item
                android:id="@+id/str_add"
                android:orderInCategory="1"
                android:title="@string/str_add"></item>
            <item
                android:id="@+id/str_sub"
                android:orderInCategory="2"
                android:title="@string/str_sub"></item>
        </menu>
    </item>

    <item
        android:id="@+id/str_color"
        android:orderInCategory="2"
        android:title="@string/str_color"></item>
    <item
        android:id="@+id/str_style"
        android:orderInCategory="3"
        android:title="@string/str_style"></item>
</menu>

佈局檔案:activity_main.xml 

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="操作字型!"
         />

</android.support.constraint.ConstraintLayout>

MainActivity.java實現 

package com.demo.test;

import android.app.Activity;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 去演示OptionsMenu的使用ø
 */
public class MainActivity extends Activity {
    private TextView tv_show;
    private float fontSize = 20.0f;
    private static final int ITEMID = 4;//選單項id

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_show = (TextView) findViewById(R.id.tv_show);
        tv_show.setTextSize(fontSize);//給字型設定預設大小
    }

    /**
     * 表示當activity建立選單是回撥的方法
     *
     * @param menu
     * @return true 用來顯示選單項
     * false 無法顯示選單項
     */

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //使用選單填充器MenuInflater、載入選單佈局
        /**
         * 1、獲得選單填充器物件
         * 2、將選單項進行填充
         */
        // MenuInflater inflater=getMenuInflater();
        //inflater.inflate(R.menu.main,menu);
        //建立選單檔案的第一種方式 xml檔案
        getMenuInflater().inflate(R.menu.main, menu);

        //建立選單檔案的第二種方式  程式碼建立
        //add(groupId 選單項分組,ItemId 選單項id,order id 表示選單項排序,
        // 選單項展示的文字)
        menu.add(Menu.NONE, ITEMID, Menu.NONE, "設定字型");

        //選項選單點選時處理的方法3 根據資源項選單item的id,給選單設定監聽事件
        MenuItem item = menu.findItem(R.id.str_style);//直接找到選單項item的id
        item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                Toast.makeText(MainActivity.this, menuItem.getTitle().toString(),
                        Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        return true;
    }

    /**
     * 表示當選項選單的item被選中時回撥的方法
     *
     * @param item 表示選單項物件
     * @return
     */
    //選項選單點選時處理的方法1
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();//獲取當前點選資源項的d
        switch (itemId) {
//            case R.id.font_group://點選設定字型大小
//                fontSize+=5;//每次點選加5
//                tv_show.setTextSize(fontSize);
//                break;
            case R.id.str_color://設定字型顏色
                //隨機生成顏色
                int red = (int) (Math.random() * 256);
                int green = (int) (Math.random() * 256);
                int blue = (int) (Math.random() * 256);
                tv_show.setTextColor(Color.rgb(red, green, blue));
                break;
            case R.id.str_add://font_group的子選單增大字型
                fontSize += 5;//每次點選加5
                tv_show.setTextSize(fontSize);
                break;
            case R.id.str_sub:////font_group的子選單減小字型
                fontSize -= 5;//每次點選加5
                tv_show.setTextSize(fontSize);
                break;


        }
        return super.onOptionsItemSelected(item);
    }

    //選項選單點選時處理的方法2 繼承Activity中的方法
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        int itemId = item.getItemId();
        //也可以通過switch來判斷是哪個選項的id
        if (itemId == ITEMID)//設定字型的選單項
            tv_show.setText("我是Activity第二種設定選單監聽的方式");
        return super.onMenuItemSelected(featureId, item);
    }
}

相關文章