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;
    }
}
时间: 2024-07-28 12:30:40

Android学习(二十二)ContentMenu上下文菜单的相关文章

Android学习笔记十二.深入理解LauncherActvity 之LauncherActivity、PreferenceActivity、PreferenceFragment

深入理解LauncherActvity 之LauncherActivity.PreferenceActivity.PreferenceFragment 从下图我们可以知道,LauncherActivity.PreferanceActivity均继承于ListActivity,其中LauncherActivity实现当列表界面列表项被点击时所对应的Acitvity被启动:PreferanceActivity实现一个程序参数设置.存储功能的Activity列表界面. 一.LauncherActivi

Android学习(十二) ContentProvider

一.ContentProvider简介       当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 二.如何实现Conte

android 学习随笔十二(网络:使用异步HttpClient框架)

使用异步HttpClient框架发送get.post请求 在https://github.com/ 搜索 asyn-http https://github.com/search?utf8=?&q=asyn-http 下载 loopj/android-async-http public class MainActivity extends Activity { Handler handler = new Handler(){ public void handleMessage(android.os

Android学习路线(二十)运用Fragment构建动态UI

要在Android系统上创建一个动态或者多面板的用户界面,你需要将UI组件以及activity行为封装成模块,让它能够在你的activity中灵活地切换显示与隐藏.你可以使用Fragment类来创建这些模块,它们能够表现得有些像嵌套的activity,它们定义着自己的布局,管理自己的生命周期. 当一个fragment指定了它自己的布局,它可以在activity中和其他的fragment配置为不同的组合,这样就能够为不同的屏幕尺寸来修改你的布局配置(在小屏幕上一次展现一个fragment,而在大屏

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

Android学习路线(二十二)运用Fragment构建动态UI——构建一个灵活的UI

先占个位置,下次翻译 :p When designing your application to support a wide range of screen sizes, you can reuse your fragments in different layout configurations to optimize the user experience based on the available screen space. For example, on a handset devi

【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续探讨BaseAdapter 我们可以同继承抽象类BaseAdapter来实现自己的Adapter,自己设置子View的UI,不同子View可以由不同的布局,并自己进行数据和子view中数据的对应关系.图是例子的呈现结果,我们有很多图标,对这些图标按一定大小进行缩放,然后布局在GridView中.这个

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

#HTTP协议学习# (十二)理解转发与重定向

本文转自:http://blog.csdn.net/meiyalei/article/details/2129120  生动清晰 解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作---->将目标资源发送给客户:在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的r