解决NestedScrollView中,在子View上滑动不触发滚动事件,却触发点击事件
2016-12-07 23:39
1001 查看
问题描述
1. 整体布局
为了实现上滑悬停的TabView,使用了CoordinatorLayout,每一个Tab里都是一个NestedScrollView。
2. 问题布局
在如图所选的区域滑动(RelativeLayout),只会触发图片的点击事件,不会触发CoordinatorLayout的滑动事件使Tab上方的布局展开或者收起。而在其它区域(LinearLayout)滑动则会正常滚动
3. 截图
分析
1. 事件分发机制
遇到滑动冲突的问题,第一反应自然是Android的事件分发机制。 先来复习下:
从源码ViewGroup来分析一个L控件的事件传递过程,引用自《Android深入透析》之Android事件分发机制。
可是因为子布局(RelativeLayout)中需要完成点击事件,所以倘若父布局(LinearLayout)拦截了触摸事件之后,子布局上滑动事件的确能正确相应了,但是点击操作就无法实现了。
2. 面向Stackoverflow编程
在尝试了事件拦截,自定义view等一系列尝试之后,我决定想谷爹求助。 最后我找到了这个:Scroll
doesn’t work in NestedScrollView when try to scroll from views with click events。
也就是说,不能滚动的原因是你滚动布局内的布局长度不够。
让我们来复现一下:
注意红箭头处的间隙,可以看到LinearLayout的长度是没有撑满屏幕的。
3. 解决办法
用setMinimumHeight给NestedScrollView内的子布局设置最小高度,这里最好通过代码计算出这个高度的值。
DisplayMetrics displaymetrics = new DisplayMetrics();
getBaseActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHeight = displaymetrics.heightPixels;
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (getBaseActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
view.setMinimumHeight(screenHeight - actionBarHeight);
总结
Google大法好!Stackoverflow大法好!
相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- CentOS Linux系统搭建Android开发环境详细介绍
- Android开发常见问题总结
- Android开发常用经典代码段集锦
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- Android开发技巧之我的菜单我做主(自定义菜单)
- Windows下使用Apache Cordova开发ANDROID之HelloWorld
- 根据根据图片的url怎么取得图片ImageView对象
- [转] ADB server didn't ACK
- android开发的相关链接
- Android数据存储之SharedPreferences 共享首选项/偏好设置
- 基于御安全APK加固的游戏反外挂方案
- 分享磨砺营马剑威讲解-android项目开发第二弹
- 分享磨砺营马剑威讲解-android项目开发第二弹