51 ct0不支持减价,原文请至:简书
关键字:快捷菜单
# #背景
我们经常在列表的页面中,点击列表中的行,一般进入详情页面,长按列表中一行,会弹出一个菜单,包含了对某一行的操作(编辑,删除等等),也知道通常的用法:
, - 0 x01。在活动中注册需要上下文菜单的观点:
,,“registerForContextMenu (mListView); '
, - 0 x02。然后在活动中继承onCreateContextMenu方法,添加菜单项:
' ' '
@Override
公共空onCreateContextMenu(快捷菜单的菜单,查看v,快捷菜单。ContextMenuInfo menuInfo) {,,
日志。d (LOG_TAG onCreateContextMenu);,,
超级。onCreateContextMenu(菜单,v, menuInfo);,,
menu.setHeaderTitle (R.string.prompt);,,
menu.add(菜单。没有,R.id。context_menu_item_delete_record,菜单。没有,R.string.delete_record);//groupId, itemId,秩序,标题,,
menu.add(菜单。没有,R.id。context_menu_item_delete_record_with_file,菜单。没有,R.string.delete_record_with_file);
}“”
, * *注:每次长按出现上下文菜单都会调用这个方法* *
' ' '
/* * *时调用的上下文菜单{@code视图}是用
。*与{@link # onCreateOptionsMenu(菜单)},这will
被称为每个*时间以及显示的上下文菜单将
应该填充*视图(视图内或物品{@link
AdapterView}子类,*这可以找到{@code
menuInfo}))。* & lt; p>*使用{@link # onContextItemSelected (android.view.MenuItem)}知道an
*项目被选中。* & lt; p>*不安全持有,
这个方法返回后上下文菜单。* */
公共空间onCreateContextMenu(快捷菜单的菜单,查看v, ContextMenuInfo menuInfo) {}
' ' '
, - 0 x03。接下来长按列表中一行的时候,会弹出上下文菜单:
![设备- 2015 - 11 - 04 - 141103. - png) (http://upload-p_w_picpaths.jianshu.io/upload_p_w_picpaths/728306-c1f997a517d009c7.png?p_w_picpathMogr2/auto-orient/strip%7Cp_w_picpathView2/2/w/1240)
, - 0 x04。点击菜单后,在活动中继承onContextItemSelected方法进行处理:
' ' '
@Override
公共布尔onContextItemSelected(子菜单项){
开关(item.getItemId ()) {
,,}}
' ' '
, - 0 x05。获取物品标识(id)
,我们删除数据库或者一行记录的时候,要知道主键(一般是id)才能进行操作,很多人就想办法,有的是把列表视图的每个ItemView添加一个LongClickListener,然后长按的时候记录下位置,然后在进行相应处理。
,,,
,,其实有更优雅的做法,onContextItemSelected(子菜单项)回调的参数项可以获取item.getMenuInfo(),在列表视图和适配器的模式中,可以强制转换成AdapterContextMenuInfo,拿到targetView(即所长按行的ItemVew,如果我们需要什么参数,直接放到View.setTag中去即可):
' ' '
, AdapterContextMenuInfo信息=(AdapterContextMenuInfo) item.getMenuInfo ();
,,int指数=info.position;
,,视图视图=info.targetView;
' ' '
至此,常见的用法就完的了,那么遇到其他自定义看待呢?
, - 0 x06。自定义视图的快捷菜单实现
下面以用到的RecycleView为例,没有了列表视图及其适配器的封装,我们需要自己处理快捷菜单。
最重要的是继承视图的两个方法:
1。上下文菜单项目的附加信息(上面item.getMenuInfo ());
' ' '
/* * *观点应该实现这个如果他们有额外的信息用
将*与上下文菜单。返回的结果是提供a
参数* {@link
OnCreateContextMenuListener # onCreateContextMenu(快捷菜单,
,看来,ContextMenuInfo)} *回调。* * @return额外的方式、
关于项目的上下文菜单*,,,,应该只显示
不同*,这个信息会有所不同,,,子类的观点。*/
保护ContextMenuInfo getContextMenuInfo () {,,
,返回null;
}
' ' '
2。ViewGroup的showContextMenuForChild,每次弹出上下文菜单都会调用此方法,需要在这里更新ContextMenuInfo;
' ' '
/* * * {@inheritDoc} */
公共布尔showContextMenuForChild(查看originalView) {,,
还mParent !=零,,mParent.showContextMenuForChild (originalView);}
' ' '
, - 0 x07。自定义RecycleView的快捷菜单全部代码
' ' '
包com.lbrant.phone.view;
进口android.content.Context;进口android.support.v7.widget.RecyclerView;
进口android.util.AttributeSet;进口android.util.Log;
进口android.view.ContextMenu;进口android.view.View;
/* *
,
*戴尔,*时间:2015/11/3 34