2013-10-26 4 views
0

Я хочу использовать несколько классов для отображения показаний акселерометра. Я попытался получить показания акселерометра в одном классе, и он работает отлично. Но в этом коде выход 0,00000, 0,000000, 0,00000Чтение акселерометра Android

Вот мои два класса:

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

Да. Ты прав. Но как обновить содержимое текстового представления? – khand041

+0

А также через отладку я понял, что программный элемент управления не входит в функцию onSensorChanged – khand041

ответ

0

Вам нужен механизм для информирования других классов, которые AccData имеет обновленные значения. Как правило, это делается слушателем - вы уже использовали эту концепцию этой строки кода:

public class AccData extends Activity implements SensorEventListener 

Ваш класс AccData получает информирован, когда был новый SensorEvent. Более подробную информацию о том, как написать слушателей можно найти на this Java tutorials page

Чтобы дать вам основную идею:

  • Создать интерфейс для слушателя, например,

    public interface MyListener{ 
        public void processSensorEvent(SensorEvent event); 
    } 
    
  • Добавить методы registerListener/unregisterListener к классу AccData. Добавьте также структуру данных для хранения зарегистрированных слушателей.
  • Напишите способ fireUpdate в AccData, который вызывается из onSensorChanged и принимает новый аргумент 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

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