Android-GridView 的 OnItemClickLi
GridView 的 OnItemClickListener 的事件无响应情况
RecyclerView 抢占焦点
EditText 默认不获取焦点
GridView 的 OnItemClickListener 的事件无响应情况
GridView 的 OnItemClickListener 的事件无响应情况:
网上说是因为:
listview、GridView 的子元素中包含了 Button 或者 ImageButton 之类的控件, 此类控件的优先级高于 Listview 、GridView 所以不能监听 Item 的点击事件。
解决办法:
-
Item 的根节点加入 “android:descendantFocusability="blocksDescendants"
-
将xxxButton 换成 TextView 等普通 View
-
设置 ItemView clickable 为 FALSE;
-
设置 GridView : descendantFocusability="blocksDescendants"
-
设置 GridView 的 Focusable 为true
奈何尝试了上面办法后还是不成功,后来改为自定义接口实现点击事件,解决。
伪代码如下:
// 自己实现接口
public interface GridViewListener{
void onItemClick(int position);
}
private GridViewListener listener;
public void setOnGridViewItemClickListner(GridViewListener listner){
this.listener = listner;
}
// item 点击
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null){
listener.onItemClick(position);
}
}
});
// 调用
gridAdapter.setOnGridViewItemClickListner(new HomeGridAdapter.GridViewListener() {
@Override
public void onItemClick(int position) {
Log.e(TAG, "onItemClick: ------------->>>" );
}
});
上面提到了android:descendantFocusability
,这东西的作用是什么呢?
android:descendantFocusability
的该属性是当一个为view
获取焦点时,定义viewGroup
和其子控件两者之间的关系。
android:descendantFocusability
的属性值有三种:
- beforeDescendants:
viewgroup
会优先其子类控件而获取到焦点 - afterDescendants:
viewgroup
只有当其子类控件不需要获取焦点时才获取焦点 - blocksDescendants:
viewgroup
会覆盖子类控件而直接获得焦点
RecyclerView 抢占焦点、EditText 默认不获取焦点
在父布局添加:
android:focusable="true"
android:focusableInTouchMode="true"
focusableInTouchMode
表示可以通过触摸获取焦点
android:focusable=“true”
不会改变android:focusableInTouchMode
,因此只在键盘状态下显示焦点,在TouchMode
状态下,依旧无法显示焦点。
TouchMode
顾名思义就是“触摸模式”。Android系统的交互方式有方向键、滚动球和触摸几种方式。采用方向键、滚动球等方式操作,需要通过焦点和高亮来表示此时操作的view
;如果设备具备触摸能力,就可以通过触摸而不需要view
高亮,这种触摸的交互方式就是touch mode
。参考-说说Android中的touch mode
android:focusable=“false”
,一定会使android:focusableInTouchMode=“false”
。
相对的
android:focusableInTouchMode=“false”
,不会影响android:focusable
。
android:focusableInTouchMode=”true”
,一定会是android:focusable=“true”
所有的获取焦点,都要有一个前提,该控件必须是可点击的,也就是该控件的clickable
属性为true
, android:clickable=”true”
, 如果都点击不了,设置焦点有什么作用呢?