2011.09.23——— android sample之Notepad(context menu)
16lz
2021-12-04
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
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
它们两个同时出现时 要明白执行顺序:
首先触发的是onItemLongClick函数,执行onItemLongClick操作,然后根据onItemLongClick的返回值判断是不是执行OnCreateContextMenuListener函数;如果onItemLongClick返回false,则会继续执行OnCreateContextMenuListener函数,否则返回true,忽略OnCreateContextMenuListener函数。
利用这一点 我们可以达到点击不同的item,会出现不同的menu的效果
5、onPrepareOptionsMenu
onCreateOptionsMenu()这个方法只会执行一次, 所以不太好判断。onPrepareOptionsMenu()这个方法在每次显示菜单前都会被调用。所以很好做判断。
6、MenuItem ContextMenuInfo
MenuItem就是menu的每一个item 可以得到每个item的id
ContextMenuInfo
提供一些额外的菜单信息 连个实现类
ExpandableListContextMenuInfo和AdapterContextMenuInfo
三个主要属性:
id:不太清楚
position:长按view在adapter的位置 从0开始
targetView:长按view
7、addIntentOptions
动态的添加item到menu
这个函数是用来动态产生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
当然写法也略有不同
要想添加上 必须在AndroidManifest.xml里面能找到对应的Activity
如果匹配上了 则在menu里面显示的文字为
显示的图标则是应用的图标
8、ContentUris
ContentUris是一个uri的辅助类 常用的两个方法:
参考: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
@Overridepublic 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);}@Overridepublic 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() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {// TODO Auto-generated method stubSystem.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来判断点击了那个menuitem.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后面添加idContentUris.parseId(uri); //根据返回的uri得到id
更多相关文章
- 箭头函数的基础使用
- Python技巧匿名函数、回调函数和高阶函数
- Android系统进程Zygote启动过程的源代码分析(2)
- Android线程间通信的Message机制
- Android中bindService的使用及Service生命周期
- Android(安卓)菜单(OptionMenu)大全 建立你自己的菜单
- Android系统进程Zygote启动过程的源代码分析
- Android系统中的广播(Broadcast)机制注册注销发送原理总结
- Android中Message机制的灵活应用(一)