Android Contextual Menus之一:floating context menu
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的更多相关文章
- Android Contextual Menus之二:contextual action mode
Android Contextual Menus之二:contextual action mode 接上文:Android Contextual Menus之一:floating context me ...
- Creating Contextual Menus创建上下文菜单
A contextual menu offers actions that affect a specific item or context frame in the UI. You can pro ...
- Android -- Options Menu,Context Menu,Popup Menu
Options Menu 创建选项菜单的步骤: 1. ...
- android开发中fragment获取context
在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...
- Tree Context Menu
Right click on a node to display context menu. My Documents Photos Program Files Intel Java Micros ...
- 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 ...
- android开发之res下的menu (xml+代码的形式)
转载请注明出处:http://blog.csdn.net/fth826595345/article/details/9199393 先来看Menu XML文件如何编写: <?xml versi ...
- Win7/Win8右键菜单管理工具(Easy Context Menu) v1.5 绿色版
软件名称: Win7/Win8右键菜单管理工具(Easy Context Menu)软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: ...
- 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 ...
随机推荐
- 每日学习总结<一> 2015-8-31
Java : 抽象类的简单概念和意义: 包名:域名相反.例: com.eric.test; 访问权限: (public/default/private/protected) public: 可以修 ...
- Tomcat源码分析
前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...
- 设计宝库:22套精美的 PhotoShop 素材免费下载
<设计宝库>系列给大家带来22套精美的 PSD 设计素材,你可以免费下载使用.设计师经常会去网上搜罗各种各样的素材,这些免费素材不仅能帮助他们节省大量的时间,而且能有很好的效果.非常感谢那 ...
- Vim魔法堂:认识快捷键绑定
Brief 习惯在VS上按<F5>来编译运行程序,刚用上VIM上就觉得无比的麻烦,而随着对VIM的学习我们分阶段的简化这一操作 1. 退出VIM,在shell下编译&&运行 ...
- EF基本操作增、删、查、改、分页,join……等
一.批量添加数据 static void Main(string[] args) { add(); add2(); Console.ReadKey(); } static void add() { D ...
- .NET Nancy 详解(三) Respone 和 ViewEngine
我们在ASP.NET MVC中可以返回各种类型的ActionResult(以下图片来自于园友--待补..) 在Nancy 中本着简单粗暴的原则,使用方式略有不同.这期我们使用的版本是Nancy的第一个 ...
- “Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置
这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一 ...
- 利用T4模板生成ASP.NET Core控制器的构造函数和参数
前言 在ASP.NET Core中引入了DI,并且通过构造函数注入参数,控制器中会大量使用DI注入各种的配置参数,如果配置注入的参数比较多,而且各个控制器需要的配置参数都基本一样的话,那么不断重复的复 ...
- C#反射技术概念作用和要点
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- OCP开放封闭原则
一.定义 软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改. 如果正确的应用了OCP原则,那么 以后在进行同样的改动时,就只需要添加新的代码,不必修改已经正常运行的代码. 二.OCP概述 1 ...