1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

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

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von funk, 01.07.2010.

  1. funk, 01.07.2010 #1
    funk

    funk Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    53
    Erhaltene Danke:
    1
    Registriert seit:
    21.12.2009
    Phone:
    Motorola Milestone
    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: 01.07.2010
  2. Rotesmofa, 07.12.2010 #2
    Rotesmofa

    Rotesmofa Fortgeschrittenes Mitglied

    Beiträge:
    279
    Erhaltene Danke:
    20
    Registriert seit:
    08.08.2010
    Hast du das Problem mittlerweile gelöst?
    Ich habe auch dieses Einsteiger Problem :thumbdn:
     
  3. AnlixStudios, 24.11.2013 #3
    AnlixStudios

    AnlixStudios Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    24.11.2013
    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 ;)
     

Diese Seite empfehlen