使用布局的Onclick属性运行出现“Could not find a method~~(View) in the activity class com.~~”

为了方便使用button的点击事件,刚刚在添加一个button的时候,做了如下简单布局:

    <Button
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"
        android:onClick="login_cancel"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="31dp" />

主要就是添加了“onclick”这个属性,然后在activity当中添加了方法来完成button的点击事件逻辑:

public void login_cancel( ){
    final FragmentTransaction mRemoveTransaction = mFragmentManager.beginTransaction();
    mRemoveTransaction.remove(mVerifyPasswordFragment);
    mRemoveTransaction.commit();
    password_cancel.setVisibility(View.GONE);
}
编译后运行,程序没问题,UI也正常,但是当我点击这个button的时候程序就崩溃了!!!怎么回事?各种找,很早之前就这样写过的,很简单的两个步骤也出错了!但花了很长时间也没有发现问题所在,还分析了源码,这个方法是通过反射的方式实现点击逻辑的,那么仔细再看看fatal exception吧:


                                                                           java.lang.IllegalStateException: Could not find a method login_back(View) in the activity class com~~~ for onClick handler on view class android.widget.Button with id 'imageView'
                                                                               at android.view.View$1.onClick(View.java:4007)
                                                                               at android.view.View.performClick(View.java:4780)
                                                                               at android.view.View$PerformClick.run(View.java:19866)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:135)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:372)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                            Caused by: java.lang.NoSuchMethodException: login_back [class android.view.View]
                                                                               at java.lang.Class.getMethod(Class.java:664)
                                                                               at java.lang.Class.getMethod(Class.java:643)
                                                                               at android.view.View$1.onClick(View.java:4000)
                                                                               at android.view.View.performClick(View.java:4780) 
                                                                               at android.view.View$PerformClick.run(View.java:19866) 
                                                                               at android.os.Handler.handleCallback(Handler.java:739) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                               at android.os.Looper.loop(Looper.java:135) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

从上面一堆当中还是可以看出是反射调用对应方法的时候抛出了异常:
“Could not find a method login_back(View) ”

关于这个onclick的反射机制可以参考这篇文章:http://blog.csdn.net/xlh1191860939/article/details/53019592,里面详细分析了整个流程,但是我当时并没有发现我的代码有什么问题。等我再仔细看这句的时候发突然发现

Could not find a method login_back(View)

后面是有参数的:(View view)! wo cao,由于自己很久没有使用这个方式添加点击事件导致漏掉了方法参数,所以反射时候方法找不到啊!!!

正确的写法应该是:

public void login_cancel(View view){
    final FragmentTransaction mRemoveTransaction = mFragmentManager.beginTransaction();
    mRemoveTransaction.remove(mVerifyPasswordFragment);
    mRemoveTransaction.commit();
    password_cancel.setVisibility(View.GONE);
}
好了,运行是没有问题了,但是当我没有在Button里面添加onclick的时,却又写了这个方法(上面那个错误的未带参数的方法),IDE是提示我了,但是当我不全了button的Onclick属性时候,这个提示就没有了,所以我就认为这已经OK了,没想到后面的参数给忘记了。看来自己实践了一把光靠编译器,自己不力接透彻的话,很容易将问题的来源给忽略掉从而浪费更多的时间的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值