2014-09-05 22 views
0

我有一个测试JNI库的Android应用程序。该应用程序有一个onClick处理程序的按钮:Button onClick的NoSuchMethod异常

<RelativeLayout 
    ... 
    <Button 
     ... 
     android:id="@+id/btnGenerate"   
     android:text="@string/btn_generate" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:onClick="btnGenerate_onClick"/> 
</RelativeLayout> 

然后,在主要活动:

public class MainActivity extends Activity { 
    ... 

    protected void btnGenerate_onClick(View view) 
    { 
     // Do some work... 
     String str = <some result>; 

     final TextView lblNumbers = (TextView)findViewById(R.id.lblNumbers); 
     if(lblNumbers != null) 
     { 
      lblNumbers.setText(str); 
     } 
    } 
} 

当我点击按钮,我收到一个NoSuchMethodException

我解除了Android Button setOnClickListener Design Help的解决方案,所以我不确定它为什么不工作。

为什么代码会导致NoSuchMethod异常?


09-05 07:20:57.417: W/dalvikvm(10563): threadid=1: thread exiting with uncaught exception (group=0x40aae228) 
09-05 07:20:57.437: E/AndroidRuntime(10563): FATAL EXCEPTION: main 
09-05 07:20:57.437: E/AndroidRuntime(10563): java.lang.IllegalStateException: Could not find a method btnGenerate_onClick(View) in the activity class com.cryptopp.prng.MainActivity for onClick handler on view class android.widget.Button with id 'btnGenerate' 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.view.View$1.onClick(View.java:3069) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.view.View.performClick(View.java:3549) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.view.View$PerformClick.run(View.java:14393) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.os.Handler.handleCallback(Handler.java:605) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.os.Looper.loop(Looper.java:154) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.app.ActivityThread.main(ActivityThread.java:4945) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at java.lang.reflect.Method.invokeNative(Native Method) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at java.lang.reflect.Method.invoke(Method.java:511) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at dalvik.system.NativeStart.main(Native Method) 
09-05 07:20:57.437: E/AndroidRuntime(10563): Caused by: java.lang.NoSuchMethodException: btnGenerate_onClick [class android.view.View] 
09-05 07:20:57.437: E/AndroidRuntime(10563): at java.lang.Class.getConstructorOrMethod(Class.java:460) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at java.lang.Class.getMethod(Class.java:915) 
09-05 07:20:57.437: E/AndroidRuntime(10563): at android.view.View$1.onClick(View.java:3062) 
09-05 07:20:57.437: E/AndroidRuntime(10563): ... 11 more 
+1

make btnGenerate_onClick(查看查看)公开 – 2014-09-05 11:31:11

回答

6

的方法应该是public,以便它可以从外部看到。

编辑: 这里是处理onClick属性Android源代码 - link

在那里,你可以看到它试图让你作为属性的值传递通过getClass().getMethod()Context对象的方法。

getMethod由Oracle网站判断“返回一个Method对象,该对象反映了由此Class对象表示的类或接口的指定公共成员方法”,因此该方法必须是public

+3

+1。文档中提到'...必须与公共方法相对应......'http://developer.android.com/reference/android/view/View.html#attr_android:onClick – 2014-09-05 11:32:37

+0

完美,谢谢。奇怪的是,除非程序公开,否则程序无法访问自己的方法。它更奇怪,我得到了一个不相关的错误信息。如果虚拟机会给我一个有意义的错误信息,那么我不会浪费你的时间(对此很抱歉)。 – jww 2014-09-05 11:45:55

+0

@jww看到编辑。 – cliffroot 2014-09-05 12:07:45