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;
        }
    }
  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4437498.html
Copyright © 2011-2022 走看看