2013-10-26 125 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