Search code examples
androidbuttonoverridinglisteneraccelerometer

How to register a sensor listener inside a button's onClick method?


I have an application in which I want to start a listener for the accelerometer when a button is clicked, so I tried this way:

private SensorManager sensorManager;

@Override
public void onCreate (Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    setContentView(R.layout.storing_act);

    Button start = (Button)findViewById(R.id.startl);

    start.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
            sensorManager.registerListener(this, 
                    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
        }
    });

but it appears a message with

"The method registerListener(SensorEventListener, Sensor, int) in the type SensorManager is not applicable for the arguments (new View.OnClickListener(){}, Sensor, int)"

Is there a way to solve it easy? Do I have to override any other method? Thanks


Solution

  • You need to use MyActivity.this because this refers to OnClickListener and the registerListener method is expecting SensorEventListener.

    public class MyActivity extends Activity implements SensorEventListener {
        @Override
        public void onCreate (Bundle savedInstanceState){
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.storing_act);
    
            Button start = (Button)findViewById(R.id.startl);
    
            start.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
                    sensorManager.registerListener(MyActivity.this, 
                            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                            SensorManager.SENSOR_DELAY_NORMAL);
                }
            });
    }