Je commence avec Scala + Android (et en utilisant le plugin sbt android). J'essaye de câbler une action de bouton à un bouton sans l'activité mettant en application View.OnClickListener.Impossible de trouver la méthode dans l'activité
Le clic sur le bouton échoue au moment de l'exécution car la méthode est introuvable. Le document que je suis en train de travailler indique qu'il suffit de déclarer une méthode void publique en prenant une vue sur l'action, et d'utiliser ce nom de méthode dans la mise en page.
Qu'ai-je fait de mal?
MainActivity.scala
package net.badgerhunt.hwa
import android.app.Activity
import android.os.Bundle
import android.widget.Button
import android.view.View
import java.util.Date
class MainActivity extends Activity {
override def onCreate(savedInstanceState: Bundle) = {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
def calculate(button: View): Unit = println("calculating with %s ...".format(button))
}
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button"
android:text=""
android:onClick="calculate"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
l'échec onclick
D/AndroidRuntime( 362): Shutting down VM
W/dalvikvm( 362): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 362): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 362): java.lang.IllegalStateException: Could not find a method calculate(View) in the activity
E/AndroidRuntime( 362): at android.view.View$1.onClick(View.java:2020)
E/AndroidRuntime( 362): at android.view.View.performClick(View.java:2364)
E/AndroidRuntime( 362): at android.view.View.onTouchEvent(View.java:4179)
E/AndroidRuntime( 362): at android.widget.TextView.onTouchEvent(TextView.java:6540)
E/AndroidRuntime( 362): at android.view.View.dispatchTouchEvent(View.java:3709)
E/AndroidRuntime( 362): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
E/AndroidRuntime( 362): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
E/AndroidRuntime( 362): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
E/AndroidRuntime( 362): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
E/AndroidRuntime( 362): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
E/AndroidRuntime( 362): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
E/AndroidRuntime( 362): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
E/AndroidRuntime( 362): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
E/AndroidRuntime( 362): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 362): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 362): at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime( 362): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 362): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 362): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 362): Caused by: java.lang.NoSuchMethodException: calculate
E/AndroidRuntime( 362): at java.lang.ClassCache.findMethodByName(ClassCache.java:308)
E/AndroidRuntime( 362): at java.lang.Class.getMethod(Class.java:1014)
E/AndroidRuntime( 362): at android.view.View$1.onClick(View.java:2017)
E/AndroidRuntime( 362): ... 20 more
MISE À JOUR
En pensant que cela peut avoir été une erreur avec le plugin sbt android, j'ai fait doublement sûr que la méthode était présente après la compilation. En utilisant javap ...
Compiled from "MainActivity.scala"
public class net.badgerhunt.hwa.MainActivity extends android.app.Activity implements scala.ScalaObject{
public net.badgerhunt.hwa.MainActivity();
public void calculate(android.view.View);
public void onCreate(android.os.Bundle);
public int $tag() throws java.rmi.RemoteException;
}