Scala/Android новичок вопрос. Я пытаюсь переписать этот простой код с Java на Scala. Рабочий код Java:
private final SensorEventListener mAccListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
// ... some code
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.start).setOnClickListener(this);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mAccListener, mAccSensor,
SensorManager.SENSOR_DELAY_GAME);
}
... и Scala:
package com.example.hello
import android.app.Activity
import android.content.Context
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorManager
import android.os.Bundle
import android.os.Bundle
import android.view.View.OnClickListener
import android.view.View
import android.view.View
import android.widget.Toast
import android.widget.Toast
import android.hardware.SensorEventListener
class HelloAndroid extends Activity {
def mAccListener (v: View) {
// ... some code
}
override def onCreate(savedInstanceState : Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
findViewById(R.id.start).setOnClickListener(new View.OnClickListener() {
def onClick(v: View) {
Toast.makeText(v.getContext, "Hello World", Toast.LENGTH_LONG).show()
}
})
val mSensorManager = getSystemService(Context.SENSOR_SERVICE).asInstanceOf[SensorManager]
val mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
mSensorManager.registerListener(mAccListener(_), mAccSensor,
SensorManager.SENSOR_DELAY_GAME)
}
}
Ошибка: состояния Eclipe:
Multiple markers at this line
- missing arguments for method mAccListener in class HelloAndroid; follow this method with '_' if you want to treat it as a partially applied function
- overloaded method value registerListener with alternatives: (android.hardware.SensorEventListener,android.hardware.Sensor,Int,android.os.Handler)Boolean <and>
(android.hardware.SensorEventListener,android.hardware.Sensor,Int)Boolean <and> (android.hardware.SensorListener,Int,Int)Boolean <and> (android.hardware.SensorListener,Int)Boolean
cannot be applied to (android.view.View => Unit, android.hardware.Sensor, Int)
Насколько я понимаю, Scala не может узнать, из какого класса вызывать метод? Как я могу это исправить?
"mAccListener (_)" создает функцию типа android.view.View => Unit. Но нет версии registerListener, которая принимает такую функцию.
Версия Java проходит в SensorListener. Не должна ли версия Scala делать то же самое?
Вероятно, вы думаете о неявном преобразовании из View => Unit в SensorListener... если это так, вам нужно создать его самостоятельно.
Он работает после этих исправлений:
class HelloAndroid extends Activity {
def mAccListener() :SensorListener = new SensorListener {
def onSensorChanged(x1: Int, x2: Array[Float]) = {
var t=findViewById(R.id.acc).asInstanceOf[TextView]
var x = x2(0).toString
t.setText(x)
}
def onAccuracyChanged(a: Int, b: Int) = {
//TODO
}
}
override def onCreate(savedInstanceState : Bundle) {
//...
mSensorManager.registerListener(mAccListener, SensorManager.SENSOR_DELAY_GAME)
}
}
Но я не понимаю, почему в Java и Scala одна и та же функция принимает разные значения. Это неудобно, так как это запутывает:
+-------------------+------------------------------+---------------------------+
| Api Function | Java | Scala |
+-------------------+------------------------------+---------------------------+
| onSensorChanged | SensorEvent event | x1: Int, x2: Array[Float] |
| onAccuracyChanged | Sensor sensor, int accuracy | a: Int, b: Int |
+-------------------+------------------------------+---------------------------+
Может кто-нибудь объяснить это?