Android Contextual Menus之一:floating context menu

上下文菜单

  上下文相关的菜单(contextual menu)用来提供影响UI中特定item或者context frame的动作。

  你可以为任何View提供上下文菜单,但是最常见的使用场景是在ListView、GridView或者其他集合类控件中的项目上,这样用户就可以对特定的项目执行一些直接的操作。

  有两种方式来提供上下文相关的动作:

  1.用悬浮上下文菜单( floating context menu)。

  当用户在支持上下文菜单的View上执行长按动作的时候,菜单以一种悬浮列表的方式出现,类似于对话框。

  用户可以每次选择一个菜单项,执行一个上下文相关的动作。

  2.用上下文相关的动作模式(contextual action mode)。

  这种模式是ActionMode的系统实现,在屏幕上方展示一个上下文相关的action bar,里面有一些action items,可以用来执行选定项目的相关动作。

  当这种模式active时,用户可以一次对多个项目执行操作。

  注意:虽然contextual action mode是更为推崇的一种方式,但是它是Android 3.0(API Level 11)之后才有的,如果要兼容3.0之前的系统,那就应该用floating context menu。

创建floating context menu

  提供悬浮上下文菜单的步骤如下:

  1.通过调用registerForContextMenu()方法注册上下文菜单相关的View。

  如果你的activity中用了ListView或者GridView,而且你想其中的每一个item都提供相同的上下文菜单,那么你可以在registerForContextMenu() 中传递这个ListView或GridView。

  2.在Activity或Fragment中实现 onCreateContextMenu()方法。

  当注册过的View接收到长按事件,系统会调用onCreateContextMenu()方法。

  这里你可以定义菜单项,通常是inflate一个菜单资源,比如:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}

  这里MenuInflater允许你通过inflate menu resource来得到一个上下文菜单。

  这个回调方法的参数包含了一个用户选择的View和一个ContextMenu.ContextMenuInfo对象,该对象提供了当前选择的item的一些附加信息。

  如果你的activity有多个views,每个提供不同的上下文菜单,你可以用这些参数来决定当前要inflate那个上下文菜单。

  3.实现onContextItemSelected()方法

  当用户选择了一个菜单项,系统会调用onContextItemSelected()方法,你可以执行相应的动作,比如:

@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
editNote(info.id);
return true;
case R.id.delete:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}

  其中getItemId()方法得到每个菜单项的id值。

  当成功处理了一个菜单项之后,返回true。

  如果你没有处理一个菜单项,你应该把这个菜单项转给它的基类实现。

  如果你的activity包含fragment,activity先接收到这个回调。

  当未处理而调用基类实现时,系统会将这个事件传递到每个fragment各自相应的回调方法中,按照fragment添加的顺序,每次一个,直到返回true或者false。

  Activity和Fragment的默认实现都是返回false,所以你应该永远在未处理的时候调用基类实现。

一个简单的例子

  实现的效果就是长按TextView之后显示一个上下文菜单,含两个菜单项,点击菜单项之后显示Toast。

  Activity代码:

package com.example.mengdd.hellocontextmenu;

import android.os.Bundle;
import android.app.Activity;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.TextView;
import android.widget.Toast; public class HelloContextMenuMainActivity extends Activity { private TextView mTextView1 = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_context_menu_main); mTextView1 = (TextView) findViewById(R.id.textView1); // 注册要弹出ContextMenu的View
registerForContextMenu(mTextView1); } @Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// 第二个参数为当前点击的view super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater();
// 把布局inflate进menu对象
inflater.inflate(R.menu.context_menu1, menu);
} @Override
public boolean onContextItemSelected(MenuItem item) { boolean result = false;
switch (item.getItemId()) {
case R.id.edit: Toast.makeText(HelloContextMenuMainActivity.this, "Edit",
Toast.LENGTH_LONG).show();
result = true;
break;
case R.id.help:
Toast.makeText(HelloContextMenuMainActivity.this, "Help",
Toast.LENGTH_LONG).show();
result = true;
break;
default:
result = super.onContextItemSelected(item);
break; } return result; } }

  Activity的内容布局:

<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".HelloContextMenuMainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </LinearLayout>

  Menu的布局:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item
android:id="@+id/edit"
android:showAsAction="ifRoom"
android:title="edit"/>
<item
android:id="@+id/help"
android:title="help"/> </menu>

参考资料

  API Guides: Menus->Creating Contextual Menus

  http://developer.android.com/guide/topics/ui/menus.html#context-menu

Android Contextual Menus之一:floating context menu的更多相关文章

  1. Android Contextual Menus之二:contextual action mode

    Android Contextual Menus之二:contextual action mode 接上文:Android Contextual Menus之一:floating context me ...

  2. Creating Contextual Menus创建上下文菜单

    A contextual menu offers actions that affect a specific item or context frame in the UI. You can pro ...

  3. Android -- Options Menu,Context Menu,Popup Menu

    Options Menu                                                                           创建选项菜单的步骤: 1. ...

  4. android开发中fragment获取context

    在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...

  5. Tree Context Menu

    Right click on a node to display context menu.   My Documents Photos Program Files Intel Java Micros ...

  6. create Context Menu in Windows Forms application using C# z

    In this article let us see how to create Context Menu in Windows Forms application using C# Introduc ...

  7. android开发之res下的menu (xml+代码的形式)

    转载请注明出处:http://blog.csdn.net/fth826595345/article/details/9199393 先来看Menu  XML文件如何编写: <?xml versi ...

  8. Win7/Win8右键菜单管理工具(Easy Context Menu) v1.5 绿色版

    软件名称: Win7/Win8右键菜单管理工具(Easy Context Menu)软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: ...

  9. Description Resource Path Location Type Project configuration is not up-to-date with pom.xml. Select: Maven->Update Project... from the project context menu or use Quick Fix. spark-MT line 1 Maven Co

    1.相信大家新建的maven项目,然后添加好依赖(即修改了pom.xml文件以后就会出现如下所示的错误): Description Resource Path Location Type Projec ...

随机推荐

  1. Solr:文本分析

    文本分析时搜索引擎的核心工作之一,对文本包含许多处理步骤,比如:分词.大写转小写.词干化.同义词转化等.简单的说,文本分析就说将一个文本字段的值转为一个一个的token,然后被保存到Lucene的索引 ...

  2. Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM

    <Windows Azure Platform 系列文章目录> Update: 2016-11-3,如果大家在使用Linux VM,使用FIO进行IOPS测试的时候,请使用以下命令: su ...

  3. CSS布局:水平居中

    前言 一直对CSS布局一知半解,这段时间打算定下心来好好学习一下,于是先从最简单的水平居中布局开始入手.下面以分页组件为实例来记录各种实现方式. common.css <style type=& ...

  4. React-Native 给客户端来个「同音词模糊搜索」

    APP上线一段时间有用户反应说不方便找东西,其实APP的数据不大也就三四百条而以,但受限于手机端展示区域太小.信息大爆炸,大家也基本上不会去记具体的名称都是根据模糊的印象进行搜索而且现在大家基本都用拼 ...

  5. git入门到熟练使用

    最近以为接触ios开发,所以对git也产生了一点兴趣.所以在网上搜索资料开始学习,但大部分都是没用的copy的文章,有一个还不错的,推荐给大家 http://www.liaoxuefeng.com/w ...

  6. 理解SQL Server是如何执行查询的 (2/3)

    查询执行的内存授予(Query Execution Memory Grant) 有些操作符需要较多的内存才能完成操作.例如,SORT.HASH.HAS聚合等.执行计划通过操作符需要处理数据量的预估值( ...

  7. C#微信公众平台开发—高级群发接口

    涉及access_token的获取请参考<C#微信公众平台开发—access_token的获取存储与更新> 一.为了实现高级群发功能,需要解决的问题 1.通过微信接口上传图文消息素材时,J ...

  8. C#利用浏览按钮获得文件路径和文件夹路径

    生成文件夹路径 private void btnChoose_Click(object sender, EventArgs e) {            using (OpenFileDialog ...

  9. webstorage[html5的本地数据处理]

    1.webStorage是什么? webStorage是html5中用于本地化存储的一种方式,而在之前呢我们是用cookie的存储方式处理; 2.那它们之间的区别是什么? Ⅰ.cookie存在的问题: ...

  10. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...