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. 箭头函数的基础使用
  2. Python技巧匿名函数、回调函数和高阶函数
  3. Android系统进程Zygote启动过程的源代码分析(2)
  4. Android线程间通信的Message机制
  5. Android中bindService的使用及Service生命周期
  6. Android(安卓)菜单(OptionMenu)大全 建立你自己的菜单
  7. Android系统进程Zygote启动过程的源代码分析
  8. Android系统中的广播(Broadcast)机制注册注销发送原理总结
  9. Android中Message机制的灵活应用(一)

随机推荐

  1. Android(安卓)开发环境
  2. Android配置文件,所有权限
  3. Android——网络连接状态管理Connectivit
  4. android简易倒计时器
  5. Android中TextView显示插入的图片实现方
  6. Kotlin的配置和使用
  7. android第一天学习
  8. Android(安卓)Studio修改项目名(快速)
  9. [Android] 判断手机上是否安装了某个程序
  10. Android(安卓)功耗(12)---如何查找待机唤醒