GUI speichern

  • 10 Antworten
  • Letztes Antwortdatum
J

jdajul

Ambitioniertes Mitglied
1
Hallo, ich habe das folgende Problem:
Ich möchte gerne RoundKnobButtons in meiner App einbinden.
Das klappt soweit, sobald ich jetzt aber zwischen Activities wechsele, so wird der Poti auf den Anfangswert zurückgesetzt. Um das zu verhindern habe ich den aktuellen Wert in onSaveInstanceState gespeichert und rufe ihn über onRestoreInstanceState wieder auf.
Das funktioniert soweit auch, wenn ich jedoch mehr als 2 mal zwischen 2 Activities wechsele, so wird der Poti wieder auf den Anfangswert gesetzt. Wie kann ich das vermeiden?

Viele Grüße,
Julian
 
indem du sharedpreferences benutzt
 
So wie ich das verstanden habe ist sharedprefs aber dazu da um Daten über die Laufzeit hinweg zu speichern. Also sind die Daten auch beim nächsten Start der App noch gespeichert. Ich brauche die Daten aber nur während der Laufzeit. Später dann nichtmehr... Gibt es da eine andere Möglichkeit?
 
Ja Bundles schnüren und diese per intent extras weiter geben
 
Ich habe es jetzt über Bundles probiert, jedoch überleben dort die Potiwerte die Displayrotation auch nicht. Das Einzige was bisher die Rotation überlebt sind die Sharedprefs, die werden aber ja auch bei App neustart gespeichert, was ich nicht möchte.

Hast du noch ne andere Idee?
 
Ein bisschen Code wäre hilfreich.. Nutzt du Fragmente?
 
Hallo, Fragmente benutze ich nicht, da ich noch unter android 2.3 programmiere.
Nachstehend noch ein paar Code-schnipsel..
Code:
public class MainActivity extends ActionBarActivity {

static Bundle mBundle;
static Intent mIntent;
@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e("abc", "ONCREATE");
    setContentView(R.layout.activity_main);
 mIntent= new Intent(this, MainActivity.class);
mBundle = new Bundle();
mIntent.putExtras(mBundle);

}

@Override
public synchronized void onResume() {
    super.onResume();
    if (D) Log.e(TAG, "+ ON RESUME +");
    //prints status of connected thread
       System.out.println("bundle: " + mBundle.getFloat("Pan3"));
    // setup of gui-elements
    Pan1.setRotorPercentage(mIntent.getExtras().getInt("Pan1213"));
    Pan2.setRotorPercentage(mIntent.getExtras().getFloat("Pan2"));
    Pan3.setRotorPercentage(mIntent.getExtras().getFloat("Pan3"));
    Pan4.setRotorPercentage(mIntent.getExtras().getFloat("Pan4"));
    Pan5.setRotorPercentage(mIntent.getExtras().getFloat("Pan5"));
    Pan6.setRotorPercentage(mIntent.getExtras().getFloat("Pan6"));
    PanMaster.setRotorPercentage(mIntent.getExtras().getFloat("PanMaster"));

}


public  void setRKBConfig(final RoundKnobButton rkb,final String name) {
    rkb.setRotorPercentage(0);
    rkb.setPotiname(name);
    rkb.SetListener(new RoundKnobButton.RoundKnobButtonListener() {
        public void onStateChange(boolean newstate) {
            //TODO: Make Fader grey, send Mute
            Toast.makeText(MainActivity.this, "New state:" + newstate, Toast.LENGTH_SHORT).show();
        }

        public void onRotate(final int value) {
            System.out.println("onRotate " + value);
            byte[] a = new byte[]{(byte) 0x01,
                    (byte) 0x00, (byte) 0x44/*, id ,channel ,y */}; //TODO: korrekte werte eingeben...
            byte[] send = configureMIDIOutputData(a);
            mBundle.putFloat(name, value * 100 / 255);
            mIntent.putExtras(mBundle);

            System.out.println("bundle!: " + mBundle.getFloat("Pan3"));
            try {
                BluetoothService.mConnectedThread.writeMIDI(send);
            } catch (Exception e) {
                System.out.println("mconnectedThread nicht offen...");
            }
        }
    });
}

}
 
Hallo

Evtl wird deine onCreate abgefeuert wenn die Orientierung sich ändert ich weiß nicht ob das so ist bei Pre-Honeycomb.
Prüfe ob der bundle savedinstancestate null ist also der in onCreate überreicht wird und mache erst dann eine neuinitialisierung wenn es null ist ansonsten mach nichts...So sollte dein bundle das alte bleiben und alle Werte bleiben erhalten

Zu der Anmerkung wegen sharedprefs:
einfach in onDestroy () entweder alle Werte Nullen oder aus den prefs rauslöschen.
 
  • Danke
Reaktionen: jdajul
Ja das problem ist, dass sowohl oncreate als auch ondestroy bei jedem orientationchange aufgerufen wird.. deshalb kann ich ja nicht in ondestroy die sharedprefs löschen, weil ich sie dann nicht mehr in der anderen Orientierung habe...

Kann man das irgendwie unterbinden?

EDIT: Die Lösung kann so einfach sein... ich habe wie Jähes geschrieben hat einfach überprüft ob mein bundle null ist... das funktioniert. Vielen dank!
 
  • Danke
Reaktionen: Jaiel
Da freut sich Jähes ;)

Das Bundle brauchst du auch nicht statisch anzulegen. Dein activity objekt bleibt solange es im backstack ist erhalten meine ich, jedoch können statische member auf "null" gesetzt werden wenn der prozess gekillt wird
 
Zuletzt bearbeitet:
Ups - entschuldige den Tippfehler ;)
Danke nochmal
 
Zurück
Oben Unten