zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4437498.html
Copyright © 2011-2022 走看看