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

@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


更多相关文章

  1. Android底部菜单栏 仿微博效果
  2. sencha touch 调用android主函数里的方法(可用与phoneGap开发第三
  3. Android仿印象笔记的自定义菜单控件
  4. Android 中Popwindow弹出菜单的两种方法实例
  5. Android sql数据库的Android包里面的函数介绍
  6. Android toolbar overflow菜单 文字显示不全

随机推荐

  1. ubuntu配置Android sdk
  2. eclipse 开发android 配置
  3. Android(安卓)studio获取sha1
  4. Android字符串资源文件format方法使用实
  5. Android应用程序换肤实现系列(二)
  6. [2010-07-18]android the mobile linux U
  7. Android(安卓)Studio安装使用教程\环境
  8. android中进度条―基础篇
  9. 第三方Android 软件商店:现状和思考
  10. OpenMax多媒体引擎