От Java до Scala: SensorManager

1

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 не может узнать, из какого класса вызывать метод? Как я могу это исправить?

Теги:

2 ответа

1
Лучший ответ

"mAccListener (_)" создает функцию типа android.view.View => Unit. Но нет версии registerListener, которая принимает такую функцию.

Версия Java проходит в SensorListener. Не должна ли версия Scala делать то же самое?

Вероятно, вы думаете о неявном преобразовании из View => Unit в SensorListener... если это так, вам нужно создать его самостоятельно.

0

Он работает после этих исправлений:

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            |
+-------------------+------------------------------+---------------------------+

Может кто-нибудь объяснить это?

  • 1
    Исходный код Java создает SensorEventListener. Ваш код Scala создает SensorListener.
  • 0
    @JamesIry Позор мне. Вы помогли, я отмечу ваш ответ. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню