Werte aus einer Klasse einer anderen Klasse übergeben und TextView verändern

F

funk

Ambitioniertes Mitglied
2
Ich bin gerade etwas am verzweifeln:

Ich versuche gerade eine App zu schreiben, in der (unter Anderem) die
Werte des Beschleunigungssensors ausgelesen werden und dann
ausgegeben werden sollen (mit den Werten passieren noch ganz andere
Schindluder [auch hier im Forum zu finden], aber es geht hier mehr um das
Grundgerüst der App).

Ich habe nun eine Accelerometer.java Klasse konstruiert, die alle
Berechnungen und Abfragen des Accelerometer durchführen soll, damit
nicht in meiner "Haupt".java zuviel Code-"Wuschd" steht. Sensors.java
(= "Haupt".java) soll sich nur um die Ausgabe und UI-Events kümmern und
jeweils die anderen Klassen (z.B. die Accelerometer.java) aufrufen wenn
benötigt und von ihr Daten beziehen zur Ausgabe(-Steuerung).

Jetzt schwirrt mir der Kopf von Intents, Handlern, Threads und sonstigem
und ich als Java-Laie bin völlig verwirrt und komm auch mit den Android
Docs und Tutorials im Netz nicht mehr weiter.

DIE FRAGE:
Wie schaffe ich es, dass die Accelerometer-Klasse im onSensorChanged
die darin ausgelesenen Werte an die Sensors übermittelt und ich dort
meine TextView aktualisieren kann?

Sorry, wenn das jetzt zu basic ist aber ich bin etwas verzweifelt...

Danke und Gruß,
Frank

PS: Hier mal meine Sensors.java
Code:
package de.zeh.android.Sensors;

import android.app.Activity;
import android.content.res.Configuration;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class Sensors extends Activity{
    
    // Deklaration Bildschirmausgabe-Variablen
    TextView grad = null;
    TextView xAccel = null;
    TextView yAccel = null;
    TextView zAccel = null;
    TextView yVelocity = null;
    TextView yDistance = null;
    TextView TempTime = null;
    TextView SensorCalibration = null;
    TextView VecSum = null;
    public long current_time = -1;
    public long start_time;
    
    float[] accelArray;
    // Deklaration der Buttons
    private Button calibrateButton;
    private Button startButton;
    private Button stopButton;
    
    // Options Menu position constant
    public static final int EXIT_ID = Menu.FIRST;
    
    // Boolean Variable um Threads zu stoppen (hier nicht im Code)
    boolean _stop = false;
 
    // Ende Deklaration
    //----------------------------------------------------------------------
    
    

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Log.d("Log 1","onCreate gestartet");
        
        // Layout Definition
        setContentView(R.layout.main);
            
        grad = (TextView) findViewById(R.id.grad);
        xAccel = (TextView) findViewById(R.id.accx);
        yAccel = (TextView) findViewById(R.id.accy);
        zAccel = (TextView) findViewById(R.id.accz);
        
        calibrateButton = (Button) findViewById(R.id.calibrate_button);
        startButton = (Button) findViewById(R.id.start_button);
        stopButton = (Button) findViewById(R.id.stop_button);

        calibrateButton.setOnClickListener(mCalibrationListener);
        startButton.setOnClickListener(mCalibrationListener);
        stopButton.setOnClickListener(mCalibrationListener);
        
        Log.d("Log 2","Motion Sensor-Part und GUI initialisiert");
        
        Accelerometer.start();
        
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            accelArray = extras.getFloatArray("accel values");
        }
        
        grad.setText(String.format("%3.0f ", accelArray[3]) + getString(R.string.comp));
        xAccel.setText(getString(R.string.accx) + String.format(": %2.2f (%2.2f)", accelArray[0], x_calib));
        yAccel.setText(getString(R.string.accy) + String.format(": %2.2f (%2.2f)", accelArray[1], y_calib));
        zAccel.setText(getString(R.string.accz) + String.format(": %2.2f (%2.2f)", accelArray[2], z_calib));
    }

    // OnClickListener für Buttons des UI
    private OnClickListener mCalibrationListener = new OnClickListener() {
        public void onClick(View v) {
            Log.d("Log 12","OnClickListener gestartet");
            if (v == calibrateButton) {
/*                 Accelerometer.doCalibration();
                 while (_CalInProgress)
                 {
                     // wait and do nothing
                 }
                 Toast.makeText(getApplicationContext(), "Kalibrierung erledigt!", Toast.LENGTH_SHORT).show();
                 SensorCalibration.setText(getString(R.string.calibration) + String.format(": %+2.5f | %+2.5f | %+2.5f", cx, cy, cz));
*/            }
            if (v == startButton) {
                Geschwindigkeit = 0.0;
                Geschwindigkeit_t0 = 0.0;
                Strecke = 0.0;
                start_time = System.currentTimeMillis();
                _stop = false;
                Log.d("Log start_1","Variablen setzen OK");
                Toast.makeText(getApplicationContext(), "Starte Lokalisierung!", Toast.LENGTH_SHORT).show();
            }
            if (v == stopButton) {
                _stop = true;
                Accelerometer.stop();
            }
        }
    };
           
    // Override-Methoden für Ende und wieder aufgenommene Ausführung der Anwendung
    @Override
    protected void onResume() {
        super.onResume();
        Accelerometer.start();
    }
    
    
    @Override
    protected void onPause() {
        Accelerometer.stop();
        super.onPause();
    }
    
    @Override
    protected void onStop() {
        Accelerometer.stop();
        super.onStop();
    }
    
    @Override
    protected void onDestroy() {
        Accelerometer.stop();
        super.onDestroy();
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        boolean result = super.onCreateOptionsMenu(menu);
        menu.add(0, EXIT_ID, 0, R.string.menu_exit);
        return result;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
        case EXIT_ID:
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      _stop = true;
      Accelerometer.start();
      setContentView(R.layout.main);
    }
}
PPS: Und hier die Accelerometer.java
Code:
package de.zeh.android.Sensors;

import java.util.List;

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

public class Accelerometer extends Sensors implements SensorEventListener{
    
    // Deklaration der Sensor-Werkzeuge und -Variablen
    private static SensorManager sensorManager;
    private static SensorEventListener sensorlistener;
    private List<Sensor> sensors;
    private static Sensor sensor;
    // Deklaration der Zeit-Variablen
    private long current_accel_time, lastUpdate = -1;
    // Deklaration der (ausgelesenen) Sensorwert-Variablen
    private static float last_x, last_y, last_z;
    public static float current_x, current_y, current_z, temp_comp, currentForce;
    // Deklaration der Variablen zum Auslesen des Sensorwert-Array
    private final int DATA_X = SensorManager.DATA_X;
    private final int DATA_Y = SensorManager.DATA_Y;
    private final int DATA_Z = SensorManager.DATA_Z;
    // Deklaration der Kalibrierungs-Variablen
    public static Double cx, cy, cz;
    
    
    public Accelerometer(Activity parent) {
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        this.sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
        this.sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
        this.sensors = sensorManager.getSensorList(Sensor.TYPE_GYROSCOPE);
        this.sensors = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
        if (sensors.size() > 0) {
            sensor = sensors.get(0);
        }
    }
    public static void start () {
        if (sensor!=null)  {
            sensorManager.registerListener(sensorlistener, sensor, SensorManager.SENSOR_DELAY_UI);
        }
    }
    
    public static void stop () {
        sensorManager.unregisterListener(sensorlistener);
    }
    
    
    public void onAccuracyChanged(Sensor s, int value) {
        // nicht genutzt
    }
    
    public void onSensorChanged(SensorEvent event) {
        
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
               temp_comp = event.values[0];
            }
        
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            
            current_x = event.values[DATA_X];
            current_y = event.values[DATA_Y];
            current_z = event.values[DATA_Z];
//            x_calib = current_x + cx;
//            y_calib = current_y + cy;
//            z_calib = current_z + cz;
            
            last_x = current_x;
            last_y = current_y;
            last_z = current_z;
        }
        float[] currentAccelArray = new float[] {current_x, current_y, current_z, temp_comp};
        
        Intent intent = new Intent(Accelerometer.this, Sensors.class);
        intent.putExtra("accel values", currentAccelArray);
        startActivity(intent);
    }
    
/*    
    public static void doCalibration () {
        _CalInProgress = true;
        double x_temp = 0;
        double y_temp = 0;
        double z_temp = 0;
        int i = 0;
        while (i < 10) {
            if (current_x != last_x || current_y != last_y || current_z != last_z) {
            x_temp += current_x;
            y_temp += current_y;
            z_temp += current_z;
            i++;
            }
        }
        
        cx = -(x_temp/10);
        cy = -(y_temp/10);
        cz = -(z_temp/10) + SensorManager.GRAVITY_EARTH;
        
        _CalInProgress = false;
    }*/
}
 
Zuletzt bearbeitet:
Hast du das Problem mittlerweile gelöst?
Ich habe auch dieses Einsteiger Problem :thumbdn:
 
Der Artikel ist zwar schon etwas älter aber falls du das problem noch nicht gelöst haben solltest: Erstell doch eine Dritte Klasse mit einem Timer, der (z.b. alle 10 millisekunden) Die werte aus der einen Klasse Ausliest und in die Andere einträgt ;)
 

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
486
jogimuc
J
5
Antworten
22
Aufrufe
1.420
590239
5
R
  • RalfKahl
Antworten
10
Aufrufe
298
RalfKahl
R
Zurück
Oben Unten