为了方便使用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了,没想到后面的参数给忘记了。看来自己实践了一把光靠编译器,自己不力接透彻的话,很容易将问题的来源给忽略掉从而浪费更多的时间的。