如下代码,当点击button时,事件的流向

代码如下


public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        findViewById(R.id.button).setOnClickListener(v -> {
            Utils.showToast("Btn Coming.");
        });
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        findViewById(R.id.container).dispatchTouchEvent(ev);
        return false;
    }
}

xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="129dp"
        android:layout_marginBottom="36dp"
        android:text="normal button"
        android:layout_centerHorizontal="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
</RelativeLayout>

问题:当点击button时,事件传递的流向?会不会回调OnClickListener()?为什么?

点击button>SecondActivity.dispatchTouchEvent(); return false;未拦截触碰事件后,会调用container.dispatchTouchEvent(ev),不用自己写。
最后会调用button.setOnClickListener()的事件。

 

更详细的你可以看看事件分发

Activity.dispatchTouchEvent:DOWN
container.dispatchTouchEvent:DOWN
container.onInterceptTouchEvent:DOWN
button.dispatchTouchEvent:DOWN
button.onTouchEvent:DOWN
container.onTouchEvent:DOWN
Activity.onTouchEvent:DOWN
这个是按下(DOWN)监听,后面要走一遍抬起(UP),都不拦截、消费

最后调用:
button.setOnClickListener()

相关推荐:https://shuaici.blog.csdn.net/article/details/118526017