viewpager设置button点击事件_android view事件分发你真的了解吗?

view事件分发你真的了解吗?起流程到底是怎样的?

我们以button为例来分析,如我们知道button的点击事件只要设置Listener如:

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

}

});

点击button那么就会执行onClick()方法,我们知道view还可以有onTouch事件,如:

button.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

return false;

}

});

当button同事注册这两个事件的时候会怎么样?可以测试一下是先执行onTouch,再执行onClick

并且OnTouch执行两次或者多次,一次按下(ACTION_DOWN),一次弹起(ACTION_UP),还有可能有移动(ACTION_MOVE)。

我们可以看到onTouch方法是有返回值的,我们所执行的是返回false,如果改为返回true,会出现什么结果,经过测试当返回true的时候不执行onClick

方法,因为onClick是在onTouch方法之后执行的,我们就理解当onTouch返回true的时候onTouch就把这一次事件消费掉了。

经过分析发现view的事件都是从dispatchTouchEvent方法开始的,我们查看Button的源码,发现没有dispatchTouchEvent方法,再看Button的父类textView

同样没有dispatchTouchEvent方法,再找TextView的父类View中,我们可以看到dispatchTouchEvent方法,里面主要有这么一段:

ListenerInfo li = mListenerInfo;

if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED

&& li.mOnTouchListener.onTouch(this, event)) {

return true;

}

if (onTouchEvent(event)) {

return true;

}

判断中mOnTouchListener !=null即我们如果button设置了TouchListener,

(mViewFlags & ENABLED_MASK) == ENABLED表示button是可点击的,li.mOnTouchListener.onTouch(this, event)即onTouch事件的返回值。

如果button默认可点击而且设置了TouchListener而且onTouch返回true,则直View的dispatchTouchEvent直接返回true,就不执行下面代码。

如果返回false,则执行onTouchEvent(event)中查看源码发现里面有performClick()里面有onClick方法。由此看来如果onTouch执行返回true则导致dispatchTouchEvent返回true而不执行onTouchEvent(event)也就不执行onClick方法。

6f9d0228ccf321b482c3a353ba68234c.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过在适配器中重写 onBindViewHolder 方法,在其中为 itemView 设置点击事件。例如: @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击事件处理逻辑 } }); } 注意,MyViewHolder 是自定义的 ViewHolder 类,itemViewViewHolder 中的 View 对象。 ### 回答2: ViewPager2 是一个支持左右滑动切换不同页面的控件,它是 Android Support Library 中 ViewPager 的新版替代品。相较于以前的版本,ViewPager2 提供了更多的功能和更加灵活的用法。 要设置 ViewPager2 的点击事件,可以通过以下步骤实现: 1. 首先,确保在项目中引入了 ViewPager2 的依赖库,在 build.gradle 文件中添加相应的依赖。 2. 在布局文件中,添加 ViewPager2 的声明。例如: ```xml <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在代码中找到 ViewPager2 对象,并设置一个适配器,用于管理页面的内容。例如: ```java ViewPager2 viewPager = findViewById(R.id.viewPager); MyAdapter adapter = new MyAdapter(); viewPager.setAdapter(adapter); ``` 这里的 MyAdapter 是自定义的适配器类,根据自己的需求来实现。 4. 如果要给 ViewPager2 设置点击事件,可以在适配器的 onBindViewHolder 方法中为每个页面的根布局设置点击监听器。例如: ```java @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position){ // 页面的根布局 View itemView = holder.itemView; // 设置点击事件监听器 itemView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ // 处理点击事件的逻辑 } }); } ``` 在这个点击事件监听器中,可以编写处理点击事件的逻辑,根据具体需求来实现。 通过以上步骤,我们就可以为 ViewPager2 设置点击事件了。注意,点击事件的具体处理逻辑需要根据实际情况来实现,以上只是一个示例。 ### 回答3: ViewPager2 是AndroidX库中的一个控件,它是用于实现滑动页面的功能。要为 ViewPager2 设置点击事件,可以按照以下步骤进行操作: 1. 首先在 XML 布局文件中添加 ViewPager2 控件,例如: ``` <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在 Java 或 Kotlin 代码中,在获取到 ViewPager2 对象后,可以通过调用它的 `setOnClickListener` 方法来设置点击事件。例如: Java 代码示例: ``` ViewPager2 viewPager = findViewById(R.id.viewPager); viewPager.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击事件处理逻辑 } }); ``` Kotlin 代码示例: ``` val viewPager: ViewPager2 = findViewById(R.id.viewPager) viewPager.setOnClickListener { // 点击事件处理逻辑 } ``` 在点击事件处理逻辑中,您可以根据需要执行相关操作,例如跳转到指定页面、显示或隐藏其他视图等等。 需要注意的是,ViewPager2 控件也可以通过 `addOnPageChangeListener` 方法来监听页面切换事件,您可以根据这个方法实现不同页面的点击操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值