对View绑定监听事件的4种写法

本文深入探讨了Android应用开发中事件监听机制的四种常见实现方式:匿名内部类、内部类、Activity接口实现及Java反射机制。通过实例演示每种方法的特点与适用场景,旨在为开发者提供灵活高效地实现事件监听的解决方案。

第一种:以匿名内部类的形式实现OnClickListener接口

button.setOnClickListener(newButton.OnClickListener() {
   
    @Override
    publicvoid onClick(View v) {
       //事件的处理
    }
});

第二种:以内部类的形式实现OnClickListener接口

private classbuttonOnClickListener implements OnClickListener{
 
    @Override
    publicvoid onClick(View v) {
       //事件的处理
    }
   
}

然后再对View控件绑定

button.setOnClickListener(newbuttonOnClickListener());

第三种:首先让Activity实现OnClickListener接口,并在Activity中实现onClick(View v)方法

public class MainActivityextends Activity implements OnClickListener{
 
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    //此处省略代码
    }
    @Override
    publicvoid onClick(View v) {
       //事件的处理
      
    }
}

然后以下面的方式对View控件绑定

button.setOnClickListener(this);

这种写法适用于Activity中的View控件较多的情况,对多个View控件绑定监听事件,此时需要在onClick(View v)方法中对点击的View控件进行判断,可以通过传递进来的View对象进行判断。

@Override
public void onClick(View v) {
    switch(v.getId()) {
    caseR.id.button:
       //事件的处理
       break;
    caseR.id.button2:
       //事件的处理
       break;
    default:
       break;
    }
}

第四种:运用Java的反射机制,在布局文件中使用android:onClick=””指明

<Button
   android:id="@+id/button"
   android:layout_width="wrap_content"
    android:layout_height="wrap_content"
   android:text="@string/hello_world"
android:onClick="btnOnClick"/>

此时只要在Activity中实现btnOnClick()方法,否则会报错。

public void btnOnClick(){
    //事件的处理
}
### 点击穿透事件导致未监听 蒙层绑定了touch事件,而被蒙层覆盖的元素绑定的是有延迟的click(或者tap)事件。touch事件触发后,蒙层消失,300ms后由于“原先遮挡在前面的蒙层消失了”,click事件就落到了被覆盖的元素上面,可能导致点击事件未按预期被监听。可以通过避免使用有延迟的事件,或者优化蒙层和元素的事件绑定逻辑来解决[^1]。 ### 按回车键触发异常导致未监听 按enter回车可能会触发button上的事件,若处理不当,可能干扰正常的点击事件监听。比如一开始粗暴地禁用回车事件,会导致其他需要回车触发的事件也执行不了;按enter回车还可能无限触发事件。可以采用绑定某个按钮,只有聚焦时回车才生效的方法,或者在点击事件后让按钮失去焦点等方式解决。例如绑定某个按钮回车生效代码如下: ```javascript $("#search_ipt").bind("keypress", function(){ if (event.keyCode == 13){ // 触发需要调用的方法 $("#search_but").click(); } }) ``` 若遇到按enter回车无限触发事件,可在点击事件中让按钮失去焦点: ```javascript export default { methods: { // 点击事件 clickBtn (e) { let target = e.target if (target.nodeName === 'SPAN' || target.nodeName === 'I') { target = e.target.parentNode } // 让其失去焦点 target.blur() } } } ``` [^2] ### onclick函数书写方式问题导致未监听 在onclick中的函数书写方式不对会导致报错,从而使得点击事件未被监听。建议通过声明一个监听函数来解决。例如: ```javascript //创建菜单 chrome.contextMenus.create({ id:'英文id或下划线组合', title: '菜单标题及名称', contexts: ['selection'] }, function () { console.log('初始化完成...'); }); //监听菜单点击 chrome.contextMenus.onClicked.addListener(function(info, tab) { if (info.menuItemId === "对应上面的id") { console.log("监听到被点击后选中的文本信息",info.selectionText); } }); ``` [^3] ### ListView点击事件失效导致未监听Android开发中,ListView的item点击事件可能会失效。ListView点击事件写法如下: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { // Toast.makeText(MainActivity.this, "Click item:" + i, Toast.LENGTH_SHORT).show(); MyToast.shouToast(MainActivity.this, "Click item:" + i, Toast.LENGTH_SHORT); } }); ``` 需要根据具体情况解决item点击事件失效的问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值