用这中方式registerForContextMenu创建的android 长按弹出菜单单怎么改成非长按的

9585人阅读
Android开发(42)
&& ContextMenu是android的context menu上下文菜单,选择某项VIEW后长按menu键,就会显示出来。比如EditeText就可以通过长按来弹出拥有“cut”,&copy&,&paste&等项的ContextMenu。
实现ContextMenu,一般要用到以下三个方法:
(1)registerForContextMenu(getExpandableListView());&
(2)onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo);
(3)onContextItemSelected(MenuItem item);
&&ContextMenu和OptionsMenu相比主要有以下区别:
1,ContextMenu必须通过Activity的来进行注册,而OptionsMenu不用。
2,ContextMenu不支持icon,而OptionsMenu支持。
3,ContextMenu可以有头,可以通过setHeaderIcon,setHeaderTitle,setHeaderView来设置头,否则就没有头。
4,弹出的方式不一样。
<span style="color:#,Options
Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们调用(&view)来指定。
注意事项:ContextMenu的任何项在被选中后,整个ContextMenu会自动被系统关闭掉,即使多选项也是这样。这样的话,多选项的行为就有些怪异。查看Android的源码后,发现这是个Android的bug,应该是google没考虑多选项的情况。
尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的(&menu,&&v,&menuInfo)方法,该方法很像生成Options
Menu的(&menu)方法。两者的不同在于,只在用户第一次按“Menu”键时被调用,而会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。
另一个&#20540;得注意的就是上图中的ContextMenuInfo,该类的对象被传入(&menu,&&v,&menuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写()方法,返回一个带有数据的ContextMenuInfo实现类对象。
介绍了这么多,下面给出一个demo演示如何创建和响应上下文菜单:
1.在activity的onCreate(...)方法中为一个view注册上下文菜单
2.在onCreateContextMenuInfo(...)中生成上下文菜单。
3.在onContextItemSelected(...)中响应上下文菜单项。
1)注册上下文菜单
/** * 上下文菜单演示Demo *
* @author CodingMyWorld
下午03:22:39 */publicclass SampleContextMenuActivity extends ListActivity {
privatestaticfinal String TAG =&SampleContextMenuActivity&;
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 显示列表
simpleShowList();
// 为所有列表项注册上下文菜单this.registerForContextMenu(getListView());
privatevoid simpleShowList() {
// list item
String[] files =new String[] {
// simple array adapter
ArrayAdapter&String& adapter =new ArrayAdapter&String&(
android.R.layout.simple_list_item_1,
// set adapterthis.setListAdapter(adapter);
Log.v(TAG, &show simple list&);
2)生成上下文菜单
在activity中重写方法。
@Overridepublicvoid onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
Log.v(TAG, &populate context menu&);
// set context menu title
menu.setHeaderTitle(&文件操作&);
// add context menu item
menu.add(0, 1, Menu.NONE, &发送&);
menu.add(0, 2, Menu.NONE, &标记为重要&);
menu.add(0, 3, Menu.NONE, &重命名&);
menu.add(0, 4, Menu.NONE, &删除&);}
3)响应上下文菜单项
与响应options menu类&#20284;,唯一的不同是可以通过menu info获得额外的信息。
@Overridepublicboolean onContextItemSelected(MenuItem item) {
// 得到当前被选中的item信息
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
Log.v(TAG, &context item seleted ID=&&#43; menuInfo.id);
switch(item.getItemId()) {
// do somethingbreak;
// do somethingbreak;
// do somethingbreak;
// do somethingbreak;
returnsuper.onContextItemSelected(item);
returntrue;}
运行程序,多次唤出上下文菜单,注意LogCat的输出,每一次都被调用了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:230922次
积分:2843
积分:2843
排名:第8635名
原创:50篇
转载:92篇
评论:26条
(4)(2)(1)(4)(1)(6)(1)(1)(14)(8)(1)(17)(11)(2)(1)(13)(2)(1)(44)(4)(4)getMenuInflater().inflate(menuRes, menu)将创建的菜单样式inflate到程序中。大体主要分三步:
第一步:建立XML资源文件:menu.xml文件一般的定义方式见如下:
&?xmlversion=&1.0&encoding=&utf-8&?&
&menuxmlns:android=&/apk/res/android&&
&itemandroid:id=&@+id/file&
android:title=&@string/file&&
&!-- &file& submenu 添加子菜单 --&
&!-- 子菜单的选项 --&
&itemandroid:id=&@+id/create_new&
android:title=&@string/create_new&/&
&itemandroid:id=&@+id/open&
android:title=&@string/open&/&
第二步:在onCreateOptionMenu回调函数完成XML资源的infate,把菜单资源文件压入到程序中,不同菜单使用不同的回调函数,比如ContextMenu使用onCreateContextMenu:
publicbooleanonCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
第三步:如果我们需要给菜单添加点击事件,一般我们是通过重写onMenuItemSelected来设置的,不同菜单使用不同的点击回调函数,比如ContextMenu使用onContextItemSelected写法如下:
publicbooleanonMenuItemSelected(intfeatureId, MenuItem item) {
switch(item.getItemId()) {
caseItem.ID1:
//do something
caseItem.ID2:
//do something
returnsuper.onMenuItemSelected(featureId, item);
3. 菜单的类型:
& &3.1 普通菜单:
& & & &一般的普通菜单,点击菜单键后显示出来的菜单,使用方法如第二点所述,只是设置item标签时把showAsAction值设为never即可。
& &3.2 显示在ActionBar的菜单:
& & & &这样的菜单可以直接从屏幕中看到,不需要点击菜单键才会显示,要做到这个只需要把Item的showAsAction从never改成ifRoom(如果有空间则显示)或always(总是显示)。例子如下;
&menuxmlns:android=&/apk/res/android&&
android:id=&@+id/info&
android:orderInCategory=&100&
android:showAsAction=&never&
android:title=&软件信息&&
&itemandroid:id=&@+id/authorInfo&
android:title=&软件开发者信息&/&
&itemandroid:id=&@+id/versionInfo&
android:title=&软件版本信息&/&
&!-- 建立一个在Action的菜单选项 --&
android:id=&@+id/settings&
android:orderInCategory=&100&
android:showAsAction=&always&
android:icon=&@drawable/ic_launcher&&
&itemandroid:id=&@+id/sysSetting&
android:title=&系统设置&/&
&itemandroid:id=&@+id/softSetting&
android:title=&软件设置&/&
& &3.3 浮动菜单(属于ContextMenu):
& & & &一般添加到ListView或GridView的菜单,长按菜单的某一项可以出发浮动菜单,定义这种菜单主要步骤如下:
1、建立一个View,常用的为ListView或GridView;
2、建立XML菜单资源文件;
3、在Activity中的onCreateContextMenu函数中使用getMenuInflater().inflate()方法将XML菜单资源文件压入;
4、在onContextItemSelected回调函数中添加菜单选项的点击事件。
5、使用registerForContextMenu(View)为该View注册ContextMenu;
源码示例如下:
privateListV
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] listItem = { &1&, &2&, &3&, &4&, &5&};
ArrayAdapter&String& aa = newArrayAdapter&String&(this,
android.R.layout.simple_list_item_1, listItem);
list = (ListView) findViewById(R.id.list);
list.setAdapter(aa);
registerForContextMenu(list);
//为list注册上下文菜单,通过onCreateContextMenu把XML菜单资源文件压进来,
//通过onContextItemSelectd为每个菜单选项添加长按点击事件。
publicvoidonCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.float_menu, menu);
publicbooleanonContextItemSelected(MenuItem item) {
switch(item.getItemId()) { //判断长按点击了那个选项,为每个选项添加长按点击事件
caseR.id.exit:
showToast(&exit&);
caseR.id.next:
showToast(&next&);
caseR.id.back:
showToast(&back&);
returnsuper.onContextItemSelected(item);
privatevoidshowToast(String str) {
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
& &3.4 ActionMode菜单(也属于ContextMenu):
& & & &显示在ActionBar的菜单,这种菜单是用于定义比较重要或常用的功能,放在ActionBar比较显眼。触发这种菜单跟浮动菜单一样,要长按,浮动菜单直接采用注册方法,而该菜单则需要我们去设置View的长按事件(setOnLongClickListener)。
使用方法:
1、建立XML菜单资源文件;
2、建立一个内部类实现ActionMode.Callback接口,实现该接口的四个函数(onCreateActionMode,onPrepareActionMode,onActionItemClicked,onDestroyActionMode)
3、在onCreateActionMode把XML文件压进来,而且返回true!
4、在onActionItemClicked中添加菜单选项点击事件;
5、建立一个View,以Button为例,添加OnLongClickListener事件,事件内容为startActionMode(实现Callback接口的类);
源代码示例:
(1)XML资源文件:
&LinearLayoutxmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:paddingBottom=&@dimen/activity_vertical_margin&
android:paddingLeft=&@dimen/activity_horizontal_margin&
android:paddingRight=&@dimen/activity_horizontal_margin&
android:paddingTop=&@dimen/activity_vertical_margin&
android:orientation=&vertical&
tools:context=&.MenuActivity2&&
android:id=&@+id/btn_actionMode&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:text=&打开ActionMode菜单&/&
android:id=&@+id/btn_popUp&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:text=&打开PopUp菜单&/&
&/LinearLayout&
(2)实现Callback的Java代码:
privateclasscallback implementsActionMode.Callback {
publicbooleanonActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()) {
caseR.id.user_info:
Toast.makeText(MenuActivity2.this, &You click user_info&,
Toast.LENGTH_SHORT).show();
caseR.id.user_setting:
Toast.makeText(MenuActivity2.this, &You click user_setting&,
Toast.LENGTH_SHORT).show();
caseR.id.user_login:
Toast.makeText(MenuActivity2.this, &You click user_login&,
Toast.LENGTH_SHORT).show();
publicbooleanonCreateActionMode(ActionMode mode, Menu menu) {
getMenuInflater().inflate(R.menu.menu_activity2, menu);
publicvoidonDestroyActionMode(ActionMode mode) {
Log.i(&cth&, &ActionMode is destroyed.&);
actionMode =
publicbooleanonPrepareActionMode(ActionMode mode, Menu menu) {
(3)长按事件Java代码:
btn_actionMode = (Button) findViewById(R.id.btn_actionMode);
btn_actionMode.setOnLongClickListener(newOnLongClickListener() { //添加长按事件
publicbooleanonLongClick(View v) {
if(actionMode != null) {
actionMode = startActionMode(newcallback());
//开启ActionMode菜单
v.setSelected(true);
//设置为可选
效果图(红框即为ActionMode菜单):
& &3.5 Popup弹出菜单:
& & & &该类菜单需要和某个View绑定,当点击该View时在该View的上面或下面(视屏幕空间而定)弹出菜单。
使用方法:
1、建立XML菜单资源文件;
2~5步均可在绑定View的点击事件中实现!
2、建立PopupMenu对象,实例化传入上下文context和绑定的View;
3、使用PopupMenu对象的getMenuInflater().inflate()把XML菜单文件压进来,
4、使用PopupMenu对象自身的setOnMenuItemClickListener设置点击事件;
5、使用PopupMenu对象自身的show显示弹出菜单。
源代码示例:
(1)在View的点击事件中设置2~5步内容:
btn_popUp = (Button) findViewById(R.id.btn_popUp);
btn_popUp.setOnClickListener(newOnClickListener() {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint(&NewApi&)
publicvoidonClick(View v) {
PopupMenu popup = newPopupMenu(MenuActivity2.this, v);
//建立PopupMenu对象
popup.getMenuInflater().inflate(R.menu.menu_activity2,
//压入XML资源文件
popup.getMenu());
popup.setOnMenuItemClickListener(MenuActivity2.this);
//设置点击菜单选项事件
popup.show();
//显示菜单
(2)点击事件
publicbooleanonMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
caseR.id.user_info:
Toast.makeText(MenuActivity2.this, &You click user_info&,
Toast.LENGTH_SHORT).show();
caseR.id.user_setting:
Toast.makeText(MenuActivity2.this, &You click user_setting&,
Toast.LENGTH_SHORT).show();
caseR.id.user_login:
Toast.makeText(MenuActivity2.this, &You click user_login&,
Toast.LENGTH_SHORT).show();
菜单主要分两种,OptionMenu和ContextMenu,只有浮动菜单(floating menu)和ActionMode菜单为ContextMenu。OptionMenu建立菜单的方法为在onCreateOptionMenu中inflate XML文件,在onMenuItemClick中设置点击事件(PopupMenu使用自身的setOnMenuItemClickListener设置),ContextMenu建立菜单的方法为在onCreateContextMenu中inflate XML文件(ActionMode在Callback中),在onContextItemClick中设置点击事件。
延伸阅读:Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())
Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())
[摘要:概述: Android 的高低文菜单类于 PC 上的左键菜单。当为一个视图注册了高低文菜单以后,少按(2 秒摆布)那个视图工具便会弹出一个浮动菜单,即高低文菜单。任何视图皆能够注册上]
Android 的上下文菜单类&#20284;于 PC 上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以注册上下文菜单,不过,最常见的是用于列表视图ListView的item。
注意:Android 的上下文菜单不支持图标或快捷键。
创建一个上下文菜单的步骤:
1. 覆盖 Activity 的 onCreateContenxtMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。
2. 覆盖 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。
3. 调用 registerForContextMenu() 方法,为视图注册上下文菜单。
MainActivity.java 文件:
main.xml 布局文件:
运行结果:
感谢关注 Ithao123Android频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊> 下上文菜单(Context Menu)(长按TextView弹出)
下上文菜单(Context Menu)(长按TextView弹出)
jiangyanfeng & &
发布时间: & &
浏览:28 & &
回复:0 & &
悬赏:0.0希赛币
上下文菜单(Context Menu)(长按TextView弹出)
  public class MainActivity extends Activity {
private static final int ITME1 = Menu.FIRST;
private static final int ITME2 = Menu.FIRST+1;
private static final int ITME3 = Menu.FIRST+2;
private TextView myTV;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTV = (TextView)findViewById(R.id.TextView01);
registerForContextMenu(myTV);//注册上下文菜单 }
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, ITME1, 0, "红色背景");
menu.add(0, ITME2, 0, "绿色背景");
menu.add(0, ITME3, 0, "白色背景");
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITME1:
myTV.setBackgroundColor(Color.RED);
case ITME2:
myTV.setBackgroundColor(Color.GREEN);
case ITME3:
myTV.setBackgroundColor(Color.WHITE);
  & xml version="1.0" encoding="utf-8" &
&LinearLayout xmlns:android=""
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent"&
&TextView android:id="@+id/TextView01" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:text="测试上下文菜单(改变文字背景色)"$>$/TextView&
&/LinearLayout&
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&}

我要回帖

更多关于 android 长按弹出复制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信