2014-02-14 4 views
0

В настоящее время я создал акселерометр для своего приложения, я хотел создать две кнопки, где я могу запустить и остановить акселерометр для сбора данных. В настоящий момент акселерометр постоянно работает. Я хотел знать, должен ли я создать отдельный метод onclick для этих кнопок? поскольку то, что у меня сейчас, не работает на моем телефоне/затмении. Любая помощь будет оценена. Мой код кнопки находится в методе onResume() и методе onPause(), это правильно?Должен ли я создать отдельный метод кнопок для датчиков?

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class movement extends Activity implements SensorEventListener { 

    private float mLastX, mLastY, mLastZ; 
    private boolean mInitialized; 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 
    private final float NOISE = (float) 2.0; 
    Button startButton, stopButton; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.movement); 
     mInitialized = false; 
     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener(this, mAccelerometer , SensorManager.SENSOR_DELAY_NORMAL); 

    } 

    protected void onResume() { 
     super.onResume(); 
     startButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mSensorManager.registerListener(movement.this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

      } 
     }); 


    } 

    protected void onPause() { 
     super.onPause(); 
     stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mSensorManager.unregisterListener(movement.this); 
      } 
     }); 


    } 


    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // can be safely ignored for this demo 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     TextView tvX= (TextView)findViewById(R.id.x_axis); 
     TextView tvY= (TextView)findViewById(R.id.y_axis); 
     TextView tvZ= (TextView)findViewById(R.id.z_axis); 
     ImageView iv = (ImageView)findViewById(R.id.image); 
     float x = event.values[0]; 
     float y = event.values[1]; 
     float z = event.values[2]; 
     if (!mInitialized) { 
      mLastX = x; 
      mLastY = y; 
      mLastZ = z; 
      tvX.setText("0.0"); 
      tvY.setText("0.0"); 
      tvZ.setText("0.0"); 
      mInitialized = true; 
     } else { 
      float deltaX = Math.abs(mLastX - x); 
      float deltaY = Math.abs(mLastY - y); 
      float deltaZ = Math.abs(mLastZ - z); 
      if (deltaX < NOISE) deltaX = (float)0.0; 
      if (deltaY < NOISE) deltaY = (float)0.0; 
      if (deltaZ < NOISE) deltaZ = (float)0.0; 
      mLastX = x; 
      mLastY = y; 
      mLastZ = z; 
      tvX.setText(Float.toString(deltaX)); 
      tvY.setText(Float.toString(deltaY)); 
      tvZ.setText(Float.toString(deltaZ)); 
      iv.setVisibility(View.VISIBLE); 
      if (deltaX > deltaY) { 
       iv.setImageResource(R.drawable.horizontal); 
      } else if (deltaY > deltaX) { 
       iv.setImageResource(R.drawable.vertical); 
      } else { 
       iv.setVisibility(View.INVISIBLE); 
      } 
     } 
    } 
} 

ответ

0

Нет, это не совсем правильно. Вы должны добавить Clicklisteners в метод onCreate() в своей активности, потому что onResume() вызывается только тогда, когда операция снова отображается на передний план, а onPause() вызывается только при перемещении на задний план.

Смотрите эту часть документации от Google для получения дополнительной информации о жизненном цикле деятельности: http://developer.android.com/guide/components/activities.html

Вот картинка Я ссылаюсь на:
http://developer.android.com/images/activity_lifecycle.png

Кроме того, вы можете использовать тег OnClick в вашем XML-файле макета, чтобы добавить вызов метода к кнопке. Обычно вам не нужно выполнять собственные прослушивания на предопределенных кнопках.

0

Ну, нужно действие, чтобы остановить датчик, так stopButton нужен свой слушатель, и очень легко

startButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mSensorManager.registerListener(movement.this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

      } 
     }); 
stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // your code 
      } 
     }); 

Респект, которые создают слушателей в onResume, лучше создать в onCreate, потому что слушатели будут созданы только один раз в activity lifecycle, кроме того, если вы создадите в onResume, они будут создавать больше одного раза. Представьте, что вы создаете активность (onResume называется), перейдите к другому действию и вернитесь к активности (onResume вызывается снова)

Смежные вопросы