2014-09-05 24 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