ListView之ContextMenu无法弹出
来源:互联网 发布:工业三维建模软件 编辑:程序博客网 时间:2024/06/05 23:55
问题
Activity中使用了ListView作为布局.当每一列表项中含有默认能获取焦点的子View时有可能会对ListView的某些事件有影响:1. OnItemClick这三个事件都无法正确响应.
2. OnItemLongClick
3. ContextMenu
对于ContextMenu.首先要在onCreate中注册Activity的ContextMenu到ListView上:
registerForContextMenu(mListView);
要在onDestroy中取消注册:
unregisterForContextMenu(mListView);
一个简单的解法就是在Adapter中构建列表中的每个Item时,把相应事件Click或者LongClick加到具体的item上面.但这样的话,会造成逻辑十分混乱.而且点击Item或者长按Item时不会有Focus的Selection.此现象十分奇怪,必定另有隐情!
Google了一下,果然StackOverflow上面有很多关于ListView 的ContextMenu的问题,首先要注意的是基本的用法,也就是上面提到的要registerForContextMenu.之后就是奇怪事件发生的地方了:
如果ListView的列表项中含有默认就有Focus的子View(如Checkbox)时,就无法获取ContextMenu.
这时就需要把Checkbox的Focus属性改变:android:focusable="false"
然后就可以了.
其实,ContextMenu也就是长按事件来的.所以不光是ContextMenu出不来,连onItemClick, onItemLongClick也都出不来!如果把Item中的Checkbox的Android:focusable属性设置成false,就可以解决这些问题.
但是,没有人能解释清楚为啥会酱紫!
看了ListView的源代码,ListView并没有控制Click和LongClick以及ContextMenu(ContextMenu也是由长按事件触发的).这些事件是由它的父类AbsListView来管理的.在AbsListView中有一个用于检查LongClick的Runnable,它里面有这样一个判断:
- View v = getChildAt(position);
- if (v != null && !v.hasFocusable()) {
- .... do long click handling which will trigger context menu.
- }
也就是说每当长按一个项时,会检查其hasFocusable()返回值,返回false时才做长按的动作.其他地方比如onTouchEvent时也都会如此的检查,发现hasFocusable()为true时就直接返回!这里注意,检查的是所点击的列表项,所以如果列表项的布局不一样,现象就有可能不一样!
那么View.hasFocusable(),当View的focusable为true时返回true,或者当其有子View的focusable为true时,就返回true.简单讲就是View本身focusable为true或者有子View的focusable为true时就返回true.
因为,ListItem里面有CheckBox,它的focusable属性默认就是true的.所以就不会有ContextMenu弹出来.如果把CheckBox的focusable属性设置为false,就可以正常的弹出了.
可以还是没弄明白为啥要酱紫设计?需要牛人来指点下!
扩展
目前来看默认就有focusable属性的有Button, CompoundButton, SeekBar, EditText,ImageButton,AutoCompleteTextView,WebView,WebTextView和它们的子类(怎么找出来了呢,到系统的style文件frameworks/base/core/res/res/value/styles.xml里面搜索focusable属性为true).所以理论上来讲,如果把这些Widget放入ListView里面时,ListView的OnItemClick,OnItemLongClick以及ContextMenu都不会有效果.解决办法就是把它们的focusable属性设为false. 0 0
- ListView之ContextMenu无法弹出
- Android实战技巧: ListView之ContextMenu无法弹出
- ListView onItemLongClick 弹出ContextMenu
- ListView:长按弹出上下文菜单(ContextMenu)
- ListView单击和长按弹出上下文菜单(ContextMenu)
- ListView 中常按键弹出contextmenu 通过onMenuItemSelected可以显示选中的ListView项
- 当长时间点击ListView时弹出contextMenu如何确定被点击listView中item的位置
- listview和ContextMenu总结
- Android ListView Item ContextMenu
- 为ListView创建ContextMenu
- 为ListView创建ContextMenu
- 弹出的ContextMenu如何确定自己是被ListView的哪一项召唤出来的
- 长按Listview任意条目可以弹出选择对话框(ContextMenu)
- 让ListView中有些长按时能弹出contextMenu,有些不能。
- android listview 长按弹出菜单--ContextMenu并进行删除操作
- Android ListView上的ContextMenu
- Menu菜单之ContextMenu
- Android之ContextMenu
- TCP实现多个客户端与服务端 数据 传输
- 开局首季问大势(2016.5.9)
- 1.1 背景相关与系统架构
- Document classification by inversion of distributed language representations
- hdu 1598(最小生成树变形)
- ListView之ContextMenu无法弹出
- Asianux 3 linux系统下GitLab客户端安装
- unity 基于socket的多人群聊实现
- 数据库的百花争艳
- javascript库之Mustache库使用说明
- C#点滴
- python读取大文件并逐行写入另外一个文件
- Role 在存储过程中不可用
- centOS中mysql一些常用操作