解决嵌套冲突
父容器嵌套子view,当子view是onTouch默认是返回ture的控件时候,父容器不能监听到点击事件,会被子view消费掉,(比如Edittext)
这里你也可以直接重写 子view onTouchEvent方法 返回false,不过我不太喜欢这样做,为了这个去多写一个类不值得。
跟踪源码
public boolean onTouchEvent(MotionEvent event) { final float x = event.getX(); final float y = event.getY(); final int viewFlags = mViewFlags; final int action = event.getAction(); final boolean clickable = ((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) || (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE; if ((viewFlags & ENABLED_MASK) == DISABLED) { if (action == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) { setPressed(false); } mPrivateFlags3 &= ~PFLAG3_FINGER_DOWN; // A disabled view that is clickable still consumes the touch // events, it just doesn't respond to them. return clickable; } ... }
分析源码可以看到final boolean clickable = ((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) || (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE;
要让clickable=false,需要设置一下子View(eg:Edittext)几个属性
android:longClickable="false"
android:contextClickable="false"
android:clickable="false"
android:enabled="false"
把上面4个属性都设置为false ,父容器就可以监听到点击事件了
https://blog.youkuaiyun.com/cgpllx/article/details/116046938
在Android开发中,当父容器嵌套子View,如EditText,子View默认会消耗点击事件导致父容器无法监听。源码分析表明,需将子View的clickable、longClickable、contextClickable和enabled属性均设为false,才能使父容器捕获点击。这种方法避免了修改子View类。了解更多解决方案详情。
763

被折叠的 条评论
为什么被折叠?



