快捷菜单高级用法

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

快捷菜单高级用法