2013-10-26 165 views
0

我想使用多個類來顯示加速度計讀數。我試圖在單個類中獲得加速度計讀數,並且運行得非常好。 但是在這個代碼的輸出是0.00000,0.000000,0.00000Android加速度計讀數

這裏是我的兩個類:

package com.example.sample; 
import android.hardware.Sensor; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.app.Activity; 
import android.content.Context; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    AccData accl=new AccData();  

    accl.mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    accl.sensor = accl.mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    accl.register(); 
    String result=accl.getAccelerometerReading(); 
    TextView display=(TextView)findViewById(R.id.tv); 
    display.setText(result); 

} 
} 

2.

package com.example.sample; 


import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.app.Activity; 
import android.content.Context; 

public class AccData extends Activity implements SensorEventListener { 


public float acclX,acclY,acclZ; 
public SensorManager mSensorManager; 
public Sensor sensor; 


@Override 
public void onSensorChanged(SensorEvent event) { 
    // TODO Auto-generated method stub 
    acclX = event.values[0]; 
    acclY =event.values[1]; 
    acclZ = event.values[2]; 
    } 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    // TODO Auto-generated method stub 

} 


public void register() { 
    // TODO Auto-generated method stub 
    mSensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL); 
} 
protected void unregister() { 
    mSensorManager.unregisterListener(this, sensor); 
} 
protected String getAccelerometerReading() 
{ 
    return String.format("%7f" + ", %7f"+ ", %7f" ,acclX,acclY,acclZ); 
} 
} 
+0

如何更新顯示的TextView的內容?當第一個活動創建時,您只設置**一次**。 –

+0

是的。你是對的。但是,如何更新textview的內容? – khand041

+0

而且還通過調試,我意識到,程序控制不進入onSensorChanged函數 – khand041

回答

0

你需要一個機制來通知其它類AccData有更新值可用。通常,這被聽衆做 - 你已經被這行代碼利用這個概念的:當有一個新的SensorEvent

public class AccData extends Activity implements SensorEventListener 

AccData類被通報。 如何寫聽衆更多信息可以在this Java tutorials page

中找到爲了給你一個基本思路:

  • 創建監聽器,例如接口

    public interface MyListener{ 
        public void processSensorEvent(SensorEvent event); 
    } 
    
  • 將registerListener/unregisterListener方法添加到類AccData。添加一個數據結構來存儲註冊的偵聽器。
  • 編寫方法fireUpdate in AccDataonSensorChanged內調用,並將新的SensorEvent作爲參數。

    @Override 
    public void onSensorChanged(SensorEvent event) { 
        acclX = event.values[0]; 
        acclY =event.values[1]; 
        acclZ = event.values[2]; 
        fireUpdate(event); 
    

    }

  • fireUpdate目的是遍歷註冊偵聽器列表中,並調用其執行方法processSensorEvent(SensorEvent event)

    private void fireUpdate(SensorEvent event){ 
        for (MyListener listener: MyListeners){ 
        listener.processSensorEvent(event); 
        } 
    } 
    
  • 的讓您的主要活動實施MyListener

    public class MainActivity extends Activity implements MyListener{ 
    
  • 然後,你將必須實現方法processSensorEvent(SensorEvent event)的主要活動,並可以用它來更新TextView的。

    public void processSensorEvent(SensorEvent event){ 
        TextView display=(TextView)findViewById(R.id.tv); 
        display.setText(event.values[0] + " " + event.values[1] + " " + event.values[2]); 
    } 
    
+0

你可以指定哪種方法應該我用。我是Android/Java編程的新手。 – khand041