java.lang.IllegalStateException: Could not execute method for android:onClick

2,743 阅读2分钟

基于监听借口机制的事件处理

面向对象的事件处理

处理流程:

  • 为某个事件源(界面组件)设置一个监听器,用户监听用户操作;
  • 当用户操作时,会触发事件源的监听器;
  • 生成对应的事件对象;
  • 将生成的事件对象作为参数传递给事件监听器;
  • 事件监听器对事件对象进行判断,执行对应的事件处理器。

常用接口 单击事件监听器View.OnClickListener

某一个Activity中的任意控件在触控模式下,有两种方式;

  1. 添加在 *.xml 中的对应控件块 android: onClick="methodName";
  2. 添加在 Activity 页面,*.setOnClickListener(this) 并且点击事件写在onClick(View view) 函数体

Problem

若使用第一种方式为空间加事件监听机制,通常会碰到以下问题: error:java.lang.IllegalStateException: Could not execute method for android:onClick

Solution

面向Problem,检验解决流程大致如下,按顺序检验并修正,最多进行到第四步即可解决,可扩展~

  1. 初始化组件
  2. 线程问题
  3. 抛出异常问题
  4. 添加 Tag 避免冲突

初始化组件

Android 应用界面的组件一般通过 xml 文件设计,在直接拖拽的基础上修改属性值得到预期的组件样式和位置,如果需要对部分组件进一步操作,需在 Activity Class 中进行声明,格式如下:

E.g:Button button = (Button) this.findViewById(R.id.button);
  • 检验被监听的组件是否进行了声明,在界面对应的 Activity Class 中 onCreate(Bundle savedInstanceState) 函数下进行相应的声明;

线程问题

默认情况下主线程是不会等待子线程的,所以当点击事件挂在主线程去做,如果点击事件未能顺利运行,会影响到主线程,所以导致了线程问题。

  • 检验点击事件相对应的实现程序是否正常,保证子线程可以顺利完成;
  • 如果检验完成仍出现此问题:
    • 可以开通一个新的线程,将点击时间挂在这个新的线程上;
    • 在主线程中采取 sleep 的措施。

抛出异常问题

在做 I/O 、Request 等操作时,为保证应用整体的完整性和程序的完整运行,通过会用异常处理代替程序终结。

  • 检验点击事件的实现程序中是否出现了相关的操作;
  • 是否为相关操作加相应的异常处理:
    • try / catch
    • throws Exception

添加 Tag 避免冲突

Tag 通常作为标签表征不同的组件

  • 如果前三个流程都进行完成仍然出现此问题,大致是因为多个组件点击事件产生了冲突
  • 在 xml 文件中需要添加点击事件的组件块中加入属性:
android:tag = "1"