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;

    }

}

 

你可能感兴趣的:(Android学习)