Android Kotlin子onClick阻止父OnTouch

我有这个布局层次结构:

     

我已经触摸父LinearLayout事件像这样:

 parent.setOnTouchListener(myCustomTouchParent) class MyCustomTouchParent(ctx: Context): View.OnTouchListener { private var isScrollingDown = false private var isScrollingUp = false private val myGestureDetected = GestureDetector(ctx, MyGestureListener()) var onRecyclerViewMovingDown: (() -> Unit)? = null override fun onTouch(p0: View?, e: MotionEvent): Boolean { myGestureDetected.onTouchEvent(e) when(e.action){ MotionEvent.ACTION_UP -> { if (isScrollingDown) { onRecyclerViewMovingDown?.invoke() } } MotionEvent.ACTION_DOWN -> { Log.i("TAg", "Action Down") isScrollingDown = false isScrollingUp = false } } return true } inner class MyGestureListener: GestureDetector.SimpleOnGestureListener() { override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean { if(e2.y - e1.y > 0){ isScrollingUp = true } else if(e2.y - e1.y < 0){ isScrollingDown = true } return super.onScroll(e1, e2, distanceX, distanceY) } } } 

基本上,这会检测父母上的“向上滚动”事件,并执行一些animation。 问题是,只要我为widget1和widget2设置了一个点击监听器,父项的触摸事件就不再起作用了。 有没有解决方法?

2 Solutions collect form web for “Android Kotlin子onClick阻止父OnTouch”

唯一对我有效的方法是:在父LinearLayout中,拦截touch,调用onTouchEvent并返回false:

 override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { onTouchEvent(ev) return false } 

将具有手势检测器类的TouchInterceptor移动到父级onTouchEvent:

 override fun onTouchEvent(e: MotionEvent): Boolean { myGestureDetected.onTouchEvent(e) when(e.action){ MotionEvent.ACTION_UP -> { if (isScrollingDown) { onRecyclerViewMovingDown?.invoke() } } MotionEvent.ACTION_DOWN -> { isScrollingDown = false isScrollingUp = false } } return super.onTouchEvent(e) } 

我不知道有没有更好的解决办法,但是这个让我先处理父母的触摸事件,然后把触摸传递给孩子。 在那里你可以设置你的点击监听器。

此外,如果您不设置点击侦听器,则包含可点击项目的触摸区域将不会触发触摸。 所以,更好的设置

 clickable=true 

在所有的项目中,然后只在需要时设置监听器。

你必须重写你的子视图上的两个onTouchListeners,并返回false,这将使他们不覆盖他们的父母ontouch。

 widget1.onTouch { view, motionEvent -> return@onTouch false } widget2.onTouch { view, motionEvent -> return@onTouch false } 
  • 从Kotlin类调用方法
  • 如何将@Value属性注入到使用Spring 5和Kotlin Bean Definition DSL定义的bean中
  • 来自java的kotlin函数默认参数
  • Iterator.Remove在Kotlin HashMap中的等价forms?
  • 使用netbeans8.2编译Errore java项目
  • 参数个数未知的Lambdatypes
  • Kotlin的Android扩展和variables
  • Proguard在Kotlin中剥离自定义注释
  • 如何在eclipse maven web项目中编译kotlin
  • 如何访问Java中的Kotlin伴侣对象?
  • Gradle在Kotlin和JUnit 5中找不到我的测试
  • Kotlin language will be the best programming language for Android.