2011.09.23——— android sample之Notepad(context menu)
参考:
http://zhyq0826.iteye.com/blog/1060556
http://apps.hi.baidu.com/share/detail/29612285
http://www.cnblogs.com/giuz/archive/2010/10/19/1855235.html
http://blog.csdn.net/craigyang/article/details/4542423
1、context menu
当你长按某一个view时 就会出现的menu
@Override
public boolean onContextItemSelected(MenuItem item) {
System.out.println("context item selected");
AdapterView.AdapterContextMenuInfo info = null ;
try {
info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
} catch (ClassCastException e) {
}
System.out.println(info.id+" "+info.position+" "+info.targetView+" "+item.getItemId());
switch(item.getItemId()){
case MENU1:
System.out.println(item.getTitle());
//执行添加操作
break;
case MENU2:
System.out.println(item.getTitle());
//执行修改操作
break;
case MENU3:
System.out.println(item.getTitle());
//执行删除操作
break;
}
return super.onContextItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
System.out.println("create context menu");
AdapterView.AdapterContextMenuInfo info ;
try {
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
return;
}
System.out.println(info.id+" "+info.position+" "+info.targetView);
menu.add(0, MENU1, 0, "添加");
menu.add(0, MENU2, 0, "修改");
menu.add(0, MENU3, 0, "删除");
super.onCreateContextMenu(menu, v, menuInfo);
}
2、绑定context menu到view
这里一共有两种方式:
2.1、view.setOnCreateContextMenuListener(this)
这里面需要注意,如果也定义了lv.setOnItemLongClickListener
则里面必须返回为false 具体看下面的介绍
2.2、registerForContextMenu()
3、options 和 context的区别
我们知道,在Android的菜单分两种:options menu 、context menu 。(也有分三种的:options menu 、context menu、sub menu)
其中options menu是和Activity相关联的,context menu 是和View关联
所以options menu是点击menu键弹出来的
context menu是绑定view后 点击改view弹出来的
4、setOnCreateContextMenuListener和setOnItemLongClickListener
lv.setOnCreateContextMenuListener(this);
//registerForContextMenu(lv);
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
System.out.println("item long click");
return true;
}
});
它们两个同时出现时 要明白执行顺序:
首先触发的是onItemLongClick函数,执行onItemLongClick操作,然后根据onItemLongClick的返回值判断是不是执行OnCreateContextMenuListener函数;如果onItemLongClick返回false,则会继续执行OnCreateContextMenuListener函数,否则返回true,忽略OnCreateContextMenuListener函数。
利用这一点 我们可以达到点击不同的item,会出现不同的menu的效果
5、onPrepareOptionsMenu
onCreateOptionsMenu()这个方法只会执行一次, 所以不太好判断。onPrepareOptionsMenu()这个方法在每次显示菜单前都会被调用。所以很好做判断。
6、MenuItem ContextMenuInfo
MenuItem就是menu的每一个item 可以得到每个item的id
item.getItemId()//根据id来判断点击了那个menu
item.getMenuInfo()//得到ContextMenuInfo
ContextMenuInfo
提供一些额外的菜单信息 连个实现类
ExpandableListContextMenuInfo和AdapterContextMenuInfo
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
Log.e(TAG, "bad menuInfo", e);
return;
}
Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
if (cursor == null) {
// For some reason the requested item isn't available, do nothing
return;
}
// Setup the menu header
menu.setHeaderTitle(cursor.getString(COLUMN_INDEX_TITLE));
// Add a menu item to delete the note
menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_delete);
}
三个主要属性:
public long id
用于显示上下文菜单的子视图的行 ID。
public int position
用于显示上下文菜单的子视图在适配器中的位置。
public View targetView
用于显示上下文菜单的子视图。也是 AdapterView 的子视图之一。
id:不太清楚
position:长按view在adapter的位置 从0开始
targetView:长按view
7、addIntentOptions
动态的添加item到menu
int android.view.Menu.addIntentOptions(
int groupId,
int itemId,
int order,
ComponentName caller,
Intent[] specifics,
Intent intent,
int flags,
MenuItem[] outSpecificItems)
这个函数是用来动态产生option menu的
函数参数分析:
groupid 就是菜单组的编号;
itemId (可以让其为0)
order 菜单顺序,可以不考虑
Caller 就是发起activity的activity
Specifics 以action+uri的具体方式来增加激活相应activity的菜单项
Intent 以categroy+uri这种一般形式来增加激活相应activity的菜单项
参数Intent和Specifics的区别是,一个用categroy+uri来匹配activity,一个用action+uri来匹配activity。
outSpecificItems 这个是返回的MenuItem值,对应以specifics方式匹配的菜单项。
specifics和intent都是添加菜单 只用写一个即可 也可都写
它们的主要区别 就是隐式意图启动activity的方式不同
Specifics 以action+uri
Intent 以categroy+uri
当然写法也略有不同
Intent[] specifics = new Intent[1];
specifics[0] = new Intent(Intent.ACTION_EDIT, uri);
MenuItem[] items = new MenuItem[1];
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, null, 0,
items);
// Give a shortcut to the edit action.
if (items[0] != null) {
items[0].setShortcut('1', 'e');
}
// ... is followed by whatever other actions are available...
Intent intent = new Intent(null, uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, null, intent, 0,null)
要想添加上 必须在AndroidManifest.xml里面能找到对应的Activity
<activity android:name="NoteEditor">
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="com.android.notepad.action.EDIT_NOTE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>
如果匹配上了 则在menu里面显示的文字为
<intent-filter android:label="@string/resolve_edit">
显示的图标则是应用的图标
8、ContentUris
ContentUris是一个uri的辅助类 常用的两个方法:
withAppendedId(Uri contentUri, long id)//在uri后面添加id
ContentUris.parseId(uri); //根据返回的uri得到id
分享到:
相关推荐
《安卓Android源码——NotePad便签》 在Android操作系统中,NotePad是经典的示例应用,用于展示基本的数据库操作、UI设计以及事件处理等核心功能。这个压缩包文件包含的就是NotePad应用的源代码,是学习Android开发...
AndroidLogger.V1.2.7 是专为Notepad++设计的一个插件,它针对Android开发人员优化了日志查看体验。 Android应用程序在开发过程中会产生大量的日志信息,通常这些日志是以纯文本格式存储,以.log为扩展名。默认情况...
《Notepad++.7.6.1.bin.x64.rar——高效文本编辑器的绿色免安装体验》 Notepad++是一款广受欢迎的免费源代码编辑器,尤其在编程领域,它以其强大的功能和高度的可定制性深受程序员喜爱。标题中的"Notepad++.7.6.1....
notepad_share_encrypt.hdoc..bin
23. **`rsop.msc`** —— 组策略结果工具。 24. **`mem.exe`** —— 显示内存使用情况。 25. **`regedit.exe`** —— 注册表编辑器。 26. **`winchat`** —— Windows聊天工具。 27. **`progman`** —— 程序管理器...
npp.8.3.3.Installer.x64.exe Notepad++
【标题】"带Androidlogger插件的notepad++"是一个专为Android开发者设计的文本编辑器增强版本,它集成了Androidlogger插件,使得在使用Notepad++进行Android代码编辑时,可以方便地查看和分析日志信息。Notepad++...
本篇文章将详细介绍如何利用Notepad++的特定版本——Notepad++-x86-Androidlog.zip,来实现对Android设备的adb日志(adb logcat)的实时查看。 首先,我们需要了解adb(Android Debug Bridge),它是Android开发者...
Android入门教程:Notepad+源代码解析 在Android开发领域,初学者往往需要从简单的项目开始学习,以便逐步掌握这个强大的移动平台的工作原理。"Notepad+"是一个经典的入门级项目,它模仿了桌面操作系统中的记事本...
首先,Notepad++的强大之处在于其对多种编程语言的支持。从HTML、CSS到JavaScript,再到Python、C++和Java,几乎涵盖了所有主流的编程语言。每种语言都有相应的语法高亮显示,使得代码更加清晰易读,有助于开发者...
尽管Notepad++最初是为替换Windows的默认记事本而创建,但其不断进化的特性使其成为专业开发者的首选工具之一。 安装文件"npp.7.8.Installer.exe"是Notepad++ 7.8版本的安装程序,用户可以通过运行这个文件来在自己...
【AndroidLogger——MGYH.zip】是一个与Android平台相关的压缩包,从文件名可以推测它包含了一个名为"AndroidLogger"的组件或者库。这个组件可能是用于日志记录和调试目的,帮助开发者收集和分析应用程序运行时的...
《深入解析Notepad++ 7.9.3安装程序》 Notepad++,这款小巧而功能强大的文本编辑器,自其诞生以来就深受广大程序员、开发者以及文本处理爱好者的喜爱。7.9.3版本是该软件的一个稳定迭代,不仅在性能上有所提升,...
The list below provides a summary of the sample applications that are available with the Android SDK. Using the links on this page, you can view the source files of the sample applications in your ...
在描述中,"Notepad++(npp.8.4.1.portable.arm64.zip)"重复了标题的信息,暗示该压缩包包含的是Notepad++的特定版本,适用于基于ARM64处理器的设备,如某些现代的Android平板或基于Arm的Windows电脑。便携式版本...
Notepad++安装包(npp.8.7.1.Installer.x64)
3. **文本编辑器**:使用文本编辑器(如Notepad++或vim)打开`menu.lst`,进行编辑。确保在保存时使用LF(换行符)作为行结束符,而不是Windows常用的CRLF,因为这可能导致GRUB解析错误。 4. **注释和组织**:在`...
`notepad` —— 记事本 `notepad` 命令用于启动记事本程序,这是一个简单的文本编辑器,可用于创建或编辑文本文件。 #### 11. `cleanmgr` —— 磁盘清理工具 `cleanmgr` 命令用于启动磁盘清理工具,可以帮助用户...
notepad++.7.8.2.Installer.x32.exe,官网下载的安装包,轻量级又方便快速的记事本,这是32位的