android 之Menu详解

基本概念:

菜单:在应用程序中有很多类型的通用应用程序组件

        A.选项菜单(OptionsMenu):当用户按手机上的菜单键时自动弹出的菜单

            onCreateOptionsMenu(Menu menu):初始化菜单项时自动调用的方法

            onOptionsItemSelected(MenuItem item):当处理用户点击菜单项时自动调用的方法

        B.上下文菜单(contextMenu):长按某个控件超过2s后弹出的菜单

        C.弹出菜单(PopMenu):当用户点击某个控件时弹出的菜单

A.选项菜单

实际效果:



控制台反馈:


 实现方式:       

<1>用java代码来实现

实例代码:

package com.hsj.example.menudemo01;

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

/**
 *
 */
public class MainActivity extends AppCompatActivity {

    private static final int MENU_FILE = Menu.FIRST+100;
    private static final int MENU_FILE_NEW = Menu.FIRST+50;
    private static final int MENU_FILE_OPEN = Menu.FIRST+25;


    private static final int MENU_EDIT = Menu.FIRST+200;

    private static final int MENU_VIEW = Menu.FIRST+300;

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


    /**
     *
     * 创建选项菜单时自动调用的方法
     * @param menu 菜单栏对象
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        //通过java 代码生成一级菜单项:menu.add(groupid,itemId,orderId,title)
        //menu.add(1,MENU_FILE,100,"文件");

        //通过java 代码生成二级菜单
        SubMenu subMenu_file=menu.addSubMenu("文件");//指定顶级菜单项的标题并返回二级菜单对象
        subMenu_file.add(1,MENU_FILE_NEW,100,"新建");
        subMenu_file.add(1,MENU_FILE_OPEN,200,"打开");

        menu.add(1,MENU_EDIT,200,"编辑");
        menu.add(1,MENU_VIEW,300,"查看");

        System.out.println("=====onCreateOptionsMenu(Menu menu)====");
        return super.onCreateOptionsMenu(menu);
    }



    /**
     * 当用户点击菜单项时自动调用的方法
     * @param item 用户点中的菜单项对象
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        String title=item.getTitle().toString();
        Toast.makeText(this,"title="+title,Toast.LENGTH_LONG).show();
        System.out.println("==onOptionsItemSelected(MenuItem item="+item+")===");

        int itemId=item.getItemId();
        switch (itemId){
            case MENU_FILE:
                System.out.println("===文件==");
                break;
            case MENU_FILE_NEW:
                System.out.println("===新建====");
                break;
            case MENU_FILE_OPEN:
                System.out.println("==打开===");
                break;




            case MENU_EDIT:
                System.out.println("====编辑====");
                break;

            case MENU_VIEW:
                System.out.println("===查看===");
        }

        return super.onOptionsItemSelected(item);
    }
}


<2>用布局填充器(关联xml)来实现

具体操作:新建一个menu文件

实例代码:

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <!--
    android:id="@+id/menu_file":指定菜单项的唯一标识
    android:title="File":菜单项上显示的文字,即菜单标题

    android:orderInCategory="300":指定菜单在类别中的排序号,数字越大越靠近手机底部
    android:enabled="false":指定菜单项是否可用,true:可用,false:不可用,所谓不可用就是菜单项变灰,不再响应用户的点击操作了

    app:showAsAction="always":指定菜单项的显示方式;always:让菜单项永远显示在ActionBar 上
    app:showAsAction="ifRoom":如果ActionBar 上有剩余空间则显示在ActionBar 上,否则隐藏才菜单条中
    app:showAsAction="never":当前<span class=""></span>菜单项永远不会显示在ActionBar 上
     android:icon="@mipmap/ic_launcher":指定菜单项显示的图标
     app:showAsAction="always|withText":当前菜单项永远显示在ActionBar 上并且伴随着显示菜单的标题,但是必须在横屏上才能同时显示,竖屏则只显示图标

    -->
    <item
        android:id="@+id/menu_file"
        android:orderInCategory="300"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:title="File">
        <menu>
            <item android:id="@+id/menu_new" android:title="新建">
                <menu>
                    <item android:title="新建word 文件"></item>
                    <item android:title="新建pdf 文件"></item>
                </menu>
            </item>
            <item android:id="@+id/menu_open" android:title="打开"/>
            <item android:id="@+id/menu_close" android:title="关闭"/>
        </menu>
    </item>
    <item
        android:id="@+id/menu_edit"
        android:orderInCategory="200"
        app:showAsAction="ifRoom"
        android:title="Edit">

    </item>
    <item
        android:id="@+id/menu_view"
        android:orderInCategory="100"
        app:showAsAction="never"
        android:title="View">
    </item>
</menu>

后台逻辑:

package com.hsj.example.menudemo01;

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

/**
 * 菜单:在应用程序中有很多类型的通用应用程序组件
 * 菜单的分类:
 *      A: 选项菜单(OptionsMenu):当用户按手机上的菜单键时弹出的菜单
 *          onCreateOptionsMenu(Menu menu):初始化菜单项时自动调用的方法
 *          onOptionsItemSelected(MenuItem item):当处理用户点击菜单项时自动调用的方法
 *
 *
 *      B:上下文菜单(ContextMenu):长按某个控件超过2s 后弹出的菜单
 *
 *      C:弹出菜单(PopMenu):当用户点击某个控件时弹出的菜单
 *
 */
public class MainActivity_bak01 extends AppCompatActivity {

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


    /**
     *
     * 布局填充器:将布局文件转换成View 对象
     *
     * 创建选项菜单时自动调用的方法
     * @param menu 菜单栏对象
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        //1.得到菜单填充器对象:将菜单文件转换成菜单对象并挂载到指定的菜单栏上
        MenuInflater menuInflater=getMenuInflater();
        menuInflater.inflate(R.menu.menu_main,menu);


        System.out.println("=====onCreateOptionsMenu(Menu menu)====");
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * 每次展开菜单项时都会自动调用的方法,可以修改某些菜单的可用性
     * @param menu
     * @return
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        //根据菜单项的id 值查找菜单对象
        MenuItem menuItem_view=menu.findItem(R.id.menu_view);
        //设置菜单项的可用性
        //menuItem_view.setEnabled(false);//禁用菜单项

        //设置菜单项的可见性
        menuItem_view.setVisible(false);//菜单性不可见


        System.out.println("===onPrepareOptionsMenu(Menu menu)==");

        return super.onPrepareOptionsMenu(menu);//如果想显示菜单项,则当前方法必须返回true
        //return false;//不会显示任何菜单对象了
    }

    /**
     * 当用户点击菜单项时自动调用的方法
     * @param item 用户点中的菜单项对象
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        System.out.println("==onOptionsItemSelected(MenuItem item="+item+")===");
        //得到菜单项的标题
        String title=item.getTitle().toString();
        Toast.makeText(this,"title="+title,Toast.LENGTH_LONG).show();

        int menuItemId= item.getItemId();
        switch (menuItemId){
            case R.id.menu_file:
                System.out.println("=====file====");
                break;
            case R.id.menu_edit:
                System.out.println("====edit=======");
                break;
            case R.id.menu_view:
                System.out.println("===view====");
                break;
        }

        return super.onOptionsItemSelected(item);
    }


B.上下文菜单:

contextMenu:

将指定内容复制到剪切板的步骤:

1.通过系统服务得到剪切板管理器对象

this.cliphboardManager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);

2.得到需要剪切的内容对象

clipData = ClipData.newPlainText("text",itemContent);

3.使用剪切板管理器对象设置需要复制的剪切内容对象

clipboardManager.setPrimaryClip(clipData);

将复制的内容粘贴到指定位置

1.通过剪切板管理器对象得到复制上的内容对应的对象

clipData = clipboardManager.getPrimaryClip();

2.通过剪切对象得到粘贴的条目对象

item1 = clipData.getItemAt(0)

3.得到复制到剪切板上的内容

content = item1.getText().toString();


业务逻辑代码:

package com.hsj.example.contextmenudemo02;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 *将指定内容复制到剪切板的步骤:
 *  1.通过系统服务得到剪贴板管理器对象
 *      this.clipboardManager= (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
 *  2.得到需要剪贴的内容对象
 *       clipData=ClipData.newPlainText("text",itemContent);
 *  3.使用剪切板管理器对象设置需要复制的剪贴内容对象
        clipboardManager.setPrimaryClip(clipData);


  将复制的内容粘贴到指定位置:
    1.通过剪贴板管理器对象得到复制上的内容对应的对象
        clipData=clipboardManager.getPrimaryClip();
    2.通过剪切对象得到粘贴的条目对象
        item1=clipData.getItemAt(0);
    3.得到复制到剪切板上的内容
        content=item1.getText().toString();

 */
public class MainActivity extends AppCompatActivity {

    private static final int MENU_FILE = Menu.FIRST + 100;
    private static final int MENU_FILE_NEW = Menu.FIRST + 50;
    private static final int MENU_FILE_OPEN = Menu.FIRST + 25;


    private static final int MENU_EDIT = Menu.FIRST + 200;
    private static final int MENU_EDIT_COPY = Menu.FIRST + 150;
    private static final int MENU_EDIT_PASTE = Menu.FIRST + 125;


    private static final int MENU_VIEW = Menu.FIRST + 300;

    private ListView listView_names;

    private List<String> data;

    private ArrayAdapter<String> adapter;


    //声明剪贴板管理器对象
    private ClipboardManager clipboardManager;

    //声明剪辑对象
    private ClipData clipData;

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



        //1.通过系统服务得到剪贴板管理器对象
         this.clipboardManager= (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);



        this.listView_names= (ListView) this.findViewById(R.id.listView_names);


        this.adapter=this.getAdapter();
        this.listView_names.setAdapter(adapter);


        //注册上下文菜单到ListView 控件上
        registerForContextMenu(this.listView_names);

    }

    private ArrayAdapter<String> getAdapter() {
        this.data=this.getData();
        adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
        return adapter;
    }

    private List<String> getData() {
        data=new ArrayList<>();
        for(int i=0;i<20;i++){
            data.add("小丽"+i);
        }
        return data;
    }


    /**
     * 初始化上下文菜单对象时自动地哦啊哟的方法
     * @param menu
     * @param v
     * @param menuInfo
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        //getMenuInflater().inflate(R.menu.menu_context,menu);

        menu.add(1,MENU_VIEW,100,"查看条目内容");
        menu.add(1,MENU_EDIT_COPY,200,"复制");
        menu.add(1,MENU_EDIT_PASTE,300,"粘贴");

    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
       // String title=item.getTitle().toString();
        //Toast.makeText(this,"title="+title,Toast.LENGTH_LONG).show();


        int itemId=item.getItemId();



        //调用菜单对象的getMenuInfo()方法得到上下文菜单信息对象ContextMenuInfo并转换成它的子类AdapterContextMenuInfo
        AdapterView.AdapterContextMenuInfo adapterContextMenuInfo= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

        //用户长按的条目对应的索引值
        int position= adapterContextMenuInfo.position;
        String itemContent=data.get(position);

        ClipData.Item item1=null;
        String content=null;
        switch (itemId){
            case MENU_VIEW:
                Toast.makeText(this,"itemContent="+itemContent,Toast.LENGTH_LONG).show();
                System.out.println("===查看===");
                break;
            case MENU_EDIT_COPY:

                //完成复制操作
                clipData=ClipData.newPlainText("text",itemContent);
                clipboardManager.setPrimaryClip(clipData);


                /*//完成粘贴操作
                clipData=clipboardManager.getPrimaryClip();//通过剪贴板管理器对象得到复制上的内容对应的对象
                item1=clipData.getItemAt(0);//通过剪切对象得到粘贴的条目对象
                content=item1.getText().toString();//得到复制到剪切板上的内容

                Toast.makeText(this,"content="+content,Toast.LENGTH_LONG).show();
*/
                System.out.println("===复制===");

                break;
            case MENU_EDIT_PASTE:
                //完成粘贴操作
                clipData=clipboardManager.getPrimaryClip();//通过剪贴板管理器对象得到复制上的内容对应的对象
                item1=clipData.getItemAt(0);//通过剪切对象得到粘贴的条目对象
                content=item1.getText().toString();//得到复制到剪切板上的内容

                Toast.makeText(this,"content="+content,Toast.LENGTH_LONG).show();

                System.out.println("===粘贴===");
                break;
        }

        return super.onContextItemSelected(item);
    }
}

C.弹出菜单

实例代码:

package com.hsj.example.popupmenudemo03;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;

/**
 * 弹出菜单:当用户点击某个View 时弹出的菜单.
 *
 * 使用剪贴板完成复制和粘贴效果的步骤:
 *  1.通过系统服务得到剪切板管理器对象
 *  2.调用剪切板管理器对象的setPrimaryClip()方法设置需要复制的数据对象
 *
 */
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {


    private static final int MENU_EDIT_COPY = Menu.FIRST+100;
    private static final int MENU_EDIT_PASTE = Menu.FIRST+200;


    private ClipboardManager clipboardManager;

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

        //1.通过系统服务得到剪切板管理器对象
        this.clipboardManager= (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
    }

    public void popup(View view){
        Button button= (Button) view;
        content=button.getText().toString();


        //1.实例化弹出菜单对象,指定上下文对象和绑定的 view 对象
        PopupMenu popupMenu=new PopupMenu(this,view);
        popupMenu.setOnMenuItemClickListener(this);
        popupMenu.getMenuInflater().inflate(R.menu.menu_popup,popupMenu.getMenu());

        //2.显示弹出菜单
        popupMenu.show();

    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        String title=item.getTitle().toString();
        Toast.makeText(this, "title="+title, Toast.LENGTH_SHORT).show();



        ClipData clipData=null;
        //得到菜单项的id 值
        int itemId=item.getItemId();
        switch (itemId){
            case R.id.menu_copy:

                clipData=ClipData.newPlainText("text",content);
                //2.调用剪切板管理器对象的setPrimaryClip()方法设置需要复制的数据对象
                clipboardManager.setPrimaryClip(clipData);

                break;

            case R.id.menu_paste:
                //3.粘贴复制到剪切板管理器上的数据对象
                clipData=clipboardManager.getPrimaryClip();
                ClipData.Item itemData=clipData.getItemAt(0);
                String pasteData=itemData.getText().toString();
                Toast.makeText(this, "pasteData="+pasteData, Toast.LENGTH_SHORT).show();
                break;
        }

        return false;
    }
}





































猜你喜欢

转载自blog.csdn.net/qq_37169103/article/details/80603688
今日推荐