Android学习(二十二)ContentMenu上下文菜单

一、上下问菜单

  在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单。有点类似与Windows系统中的右键菜单。

二、上下文菜单的内容

  1、标题

  2、图标

  3、菜单项

  4、对应的菜单事件

三、OptionsMenu和ContentMenu的区别:

  1、OptionMenu对应的Activity,一个Activity只能拥有一个选项菜单。

  2、 ContentMenu对应的View,每个View都可以设置上下文菜单。

  3、一般情况下,上下文菜单常用于ListView或者GirdView。

  

四、如何实现ContentMenu:

  1、首先给View注册上下文菜单,registerForContextMenu();

  2、通过xml布局的方式添加菜单项,也可以通过代码的方式动态添加菜单项。

  3、设置菜单点击后的相应事件,onContextItemSelected();

五、代码实现

main.xml:放置一个ListView用来显示列表信息

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/lv_files"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</LinearLayout>

menu_layout.xml,自定义的菜单项内容,可以通过菜单中getMenuInflater方法获取定义好的xml菜单。

<menu 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"
    tools:context=".MainActivity">
    <item
        android:id="@+id/menu_copy"
        android:orderInCategory="100"
        android:title="复制"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_paste"
        android:orderInCategory="100"
        android:title="粘贴"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_cut"
        android:orderInCategory="100"
        android:title="剪切"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_rename"
        android:orderInCategory="100"
        android:title="重命名"
        app:showAsAction="never" />
</menu>

main.java

package com.example.zhengcheng.contextmenudemo;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.MenuInflater;
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.zip.Inflater;


public class MainActivity extends ActionBarActivity {

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

    ListView lv_files;

    private void LoadListView() {

        lv_files = (ListView) findViewById(R.id.lv_files);
        //创建一个适配器,用来填充到ListView中。
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, getArrayList());
        //设置listView的适配器
        lv_files.setAdapter(adapter);
        //为listview注册上下文菜单
        this.registerForContextMenu(lv_files);
    }

    /**
     * 创建上下文菜单,重写onCreateContextMenu方法
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("文件操作");             //设置上下问菜单的标题
        menu.setHeaderIcon(R.mipmap.ic_launcher);   //设置上下问菜单的图标

        //动态添加菜单项
//        menu.add(1,101,1,"复制");
//        menu.add(1,102,1,"粘贴");
//        menu.add(1,103,1,"剪切");
//        menu.add(1,104,1,"删除");
//        menu.add(1,105,1,"重命名");

        //导入xml菜单内容
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_layout, menu);
    }

    /**
     * 设置上下问菜单内容的点击事件,重写onContextItemSelected方法
     */
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        //获取选中的ListView中的Item项
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();


        //给动态生成的菜单项添加事件
//        switch (item.getItemId()) {
//            case 101:
//                Toast.makeText(this, "复制", Toast.LENGTH_SHORT).show();
//                break;
//            case 102:
//                Toast.makeText(this, "粘贴", Toast.LENGTH_SHORT).show();
//                break;
//            case 103:
//                Toast.makeText(this, "剪切", Toast.LENGTH_SHORT).show();
//                break;
//            case 104:
//                Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show();
//                break;
//            case 105:
//                Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show();
//                break;
//        }



        //给xml菜单项生成事件
        switch (item.getItemId()){
            case R.id.menu_copy:
                //Toast.makeText(this, "xml_复制", Toast.LENGTH_SHORT).show();
                Toast.makeText(this, info.toString() + "复制", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_cut:
                Toast.makeText(this, "xml_剪切", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_paste:
                Toast.makeText(this, "xml_粘贴", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_rename:
                Toast.makeText(this, "xml_重命名", Toast.LENGTH_SHORT).show();
                break;
        }

        return super.onContextItemSelected(item);
    }

    /**
     * 获取数据,填充到ArrayAdapter的数据
     *
     * @return
     */
    private ArrayList<String> getArrayList() {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add("文件" + i);
        }
        return list;
    }
}
原文地址:https://www.cnblogs.com/zhengcheng/p/4437498.html