将onClickListener设为静态方法后,直接调用ocl.ocl_action()无效问题
解决OnClickListener内部方法无法直接调用的问题
嘿,我来帮你捋捋这个问题~你遇到的核心问题是:你定义的ocl_action()是匿名内部类里的方法,而你的变量ocl的类型是父接口View.OnClickListener——这个接口里根本没有ocl_action()方法,所以编译器根本找不到这个方法,自然没法直接调用它。而且匿名内部类的非公共方法,外部本来就访问不到。
下面给你两种靠谱的解决思路:
思路一:把逻辑提取到Activity的成员方法(最推荐)
把ocl_action()里的逻辑抽出来,变成ControllerProjMain类的成员方法,这样不管是点击事件里还是外部代码,都能直接调用:
// 在ControllerProjMain类中定义成员方法 private void handleClickAction() { for(int i=0; i<5;i++){ // 这里写你的循环逻辑 } Toast.makeText(ControllerProjMain.this,"hi",Toast.LENGTH_LONG).show(); } // 创建OnClickListener时直接调用这个方法 View.OnClickListener ocl = new View.OnClickListener(){ @Override public void onClick(View v) { handleClickAction(); // 调用Activity的成员方法 } };
之后你想触发这个逻辑,直接调用handleClickAction()就行,完全不需要通过ocl对象去调用。
思路二:改用命名内部类(如果非要保留内部类方法)
如果你一定要把方法放在点击监听类里,可以放弃匿名内部类,改用命名内部类,这样就能直接创建实例并调用它的方法:
// 在ControllerProjMain类中定义命名内部类 class MyClickListener implements View.OnClickListener { @Override public void onClick(View v) { oclAction(); } public void oclAction() { for(int i=0; i<5;i++){ // 循环逻辑 } Toast.makeText(ControllerProjMain.this,"hi",Toast.LENGTH_LONG).show(); } } // 创建实例 MyClickListener ocl = new MyClickListener(); // 现在可以直接调用方法 ocl.oclAction(); // 同时也能正常给View设置点击事件 yourView.setOnClickListener(ocl);
补充说明
你原来的代码里this.ocl_action()其实没问题——匿名内部类里的this指向内部类实例,不过其实直接写ocl_action()就行,没必要加this。但核心问题还是外部访问不到这个方法,所以上面的两种方案都能解决你的问题。
内容的提问来源于stack exchange,提问作者David C Dong
相关产品推荐
相关产品推荐

