TextView-Felder nach Layout-/Formatwechsel im Urzustand

  • Hallo!


    Ich bin sowohl hier als auch in der Android-Welt ganz neu. Nachdem ich mir in der Uni im letzten Jahr erste Java-Grundlagen angeeignet hatte, wollte ich diese jetzt mal in einem kleinen Android-Projekt praktisch anwenden. Nach den ersten Startschwierigkeiten funktionierte bislang alles ganz relativ gut - im Detail habe ich nun jedoch einige Probleme, die ich bislang nicht ganz nachvollziehen kann. Ich hoffe, dass die Fragen nicht schon mehrfach behandelt wurden...


    Im Wesentlichen zählt die App nur Punkte hoch (nach Buttonklick) für mehrere Mitspieler. Das ganze sind normale int-Variablen, deren Werte in die Textviews des Layouts übertragen werden. Auf dem ersten Blick funktionierte alles super, auf dem zweiten tauchen einige Bugs auf:


    1) Ich habe eine zweite Seite entworfen, auf die man kommt, wenn man einen bestimmten Button anklickt. Wenn man nun wieder auf die Ursprungsseite wechselt, sind alle Textviews wieder im Urspungsszustand (0 Punkte). Wenn ich nun den Button für die Punkte anklicke, zählt das Programm jedoch von da weiter, wo aufgehört wurde (vor dem Seitenwechsel). Also die Werte in den int-Variablen bleiben zwar bestehen, sind aber nicht mehr in den Textviews. Ich habe beim Seitenwechsel nun eine Methode datenWiederherstellen() eingebaut, die sämtliche Variablen ausliest und mit setText wieder in die Textviews schreibt -das funktioniet. Mir kommt diese Methode etwas umständlich vor. Daher meine Frage. Warum ist das überhaupt so und wie wird dieses Problem normalerweise umgangen?


    2) Das zweite Problem ist ähnlich, nur schwerwiegender. Wenn ich von der Hochkantansicht in die Queransicht wechsle, sind ebenfalls alle Punktzahlen wieder bei null - nur diesmal sind die Punktestände nicht mehr in den int Variablen enthalten. Ich kann sie also gar nicht mehr mit setText zurückschreiben. Auch hier würde ich gerne wieder wissen, welchen Hintergrund diese Verhaltensweise hat und wie man dieses Problem für gewöhnlich umgeht.


    Ich hoffe, ich konnte meine Probleme verständlich rüberbringen. Vielen Dank schonmal


    Marco

  • Ich würde grundsätzlich alle Variablen die du in verschiedenen Activities benutzen willst, bzw die du nach verlassen einer Activity zur nächsten und späterem zurückkehren/neuem Aufrufen der alten Activity, in ein Objekt einer extra Control Klasse speichern.
    zB:

    Java
    public class Control{	// Attribute (in deinem Fall einfach mal eine int Variabel:	int x;	private static Control instance; // Über die du später alles ausliest.		// Konstruktor (ohne Übergabe Parameter da irrelevant.	public Control(){	}	// Abfrage der Instanz, falls diese noch nicht initialisiert wurde wird sie erstellt.	public static GameControl getInstance() {
    		
    		if (instance == null) {
    			instance = new GameControl();
    		}
    		
    		return instance;
        }
        private int getX(){        return x;    }    private void setX(int x){    this.x = x;    }	}


    Sry für die Unordnung die Java Quelltext Funktion ist nicht zum selber tippen :P


    Innerhalb dieser Klasse kannst du dann beliebig viele Daten speichern. Diese dann vorm verlassen der alten Activity speichern und beim erstellen bzw zurückkehren ( Inwiefern kennst du dich mit dem Android Lifecycle aus? http://stackoverflow.com/quest…tivity-life-cycle-android ) daraus abrufen.
    Ich glaube dein größtes Problem ist der Lifecycle du hast alles in der OnCreate() oder seh ich das falsch?


    MfG

  • Ok, schonmal vielen Dank für die schnellen Rückmeldungen. Und ja, Lifecycle war anscheinend der richtige Stichpunkt und die beiden Methoden onSaveInstanceState() und onRestoreInstanceState() scheinen die Lösung zu sein. Hier werde ich mal ein wenig austesten und mich bei Fragen ggf. erneut melden ;)


    Zu der Kontrollklasse: Ich ändere einfach alle Methoden, die lokale Varibalen verändern dahingehend, dass sie die stattdessen die Methode setVariable() der Kontrollklasse aufrufen und lagere somit die Werte aus - das habe ich verstanden. Objekte dieser Klasse werden keine erzeugt sondern es wird lediglich auf die statischen Methoden/Variablen zugegrifen, ist das richtig? Welche (weiteren) Vorteile bietet dieses Vorgehen?

    Ich glaube dein größtes Problem ist der Lifecycle du hast alles in der OnCreate() oder seh ich das falsch?

    In der onCreate() habe ich bislang auch nicht wirklich viel stehen (außer den Aufruf des Layouts). Aktuell befüllen meine Berechnungsmethoden die TextViews am Ende mit setText und beim LayoutWechsel übernimmt dies eine extra Methode datenWiederherstellen(), die alle Variablen ausliest und die TextViews befüllt. Ist wie gesagt mein erstes kleines Projekt und einiges ist evtl. recht unkonventionell gelöst ;)

  • Ein ganz guter Vorteil dafür besteht darin wenn du größere Projekte angehst. zB willst du 4 / 5 Activities später wieder auf dein x zugreifen:
    int xDerNeuenKlasse = Control.getInstance().getX();


    Das Objekt der Klasse ist Instance und wird innerhalb der getInstance() falls es nicht initialisiert ist, direkt initialisiert.

  • Den Lebenszklus der Activities habe ich in der Theorie gut verstanden. Nur leider hapert es in der Praxis. Bislang habe ich es so verstanden:


    1) In der Methode protected void onSaveInstanceState(Bundle outState) muss ich die Werte sichern
    2) In der onCreate-Methode muss ich mit savedInstanceState.getInt() die Werte wieder zurücksichern.


    Meine Fragen dazu sind:
    1) Ist es richtig, dass ich für jede zu sichernde Variable eine neue Kostante erzeugen muss, in welche dieser Wert geschrieben wird (Eclipse fordert dies immer)? Wenn mehrere Variablen gesichert werden sollen, erscheint mir das sehr aufwendig.
    2) Was mache ich mit Objekten anderer Klassen? Die kann ich so doch nicht sichern, oder? Die werden, wenn ich den Bildschirm drehe, doch ebenfalls zerstört...


    Vielleicht habe ich gerade auch nur einen Denkfehler aber im Moment komme ich alleine einfach nicht zum Ziel...Vielen Dank schonmal...

  • Leider bin ich an dieser Stelle noch nicht ganz weitergekommen. Ich denke, ein Beispiel würde mir hier gut weiterhelfen - vielleicht wäre jemand so nett:


    Wir können ja annehmen, dass ich sowohl eine Variable (int x) der Activityklasse als auch eine
    Variable eines Objekts "a" aus einer anderen Klasse (a.getIntY()) so sichern möchte, dass diese sowohl beim Seiten(Activity-)wechsel innerhalb des Programms, als auch beim Drehen des Bildschirms erhalten bleiben und in entsprechenden Textviews (tv1 und tv2) beim erneuten
    Aufruf der Activity eingesetzt werden.


    1) In erster Linie interessieren mich die genauen Stellen (Methoden), wo Sicherungen dieser Art einzubauen sind. Ich gehe von onPause() aus - ist das richtig?
    2) Beim Rücksichern bin ich mir ebenfalls nicht ganz sicher wohin, damit alle Fälle abgedeckt sind. Hier tippe ich auf onResume().
    3) Sollte man interne Variablen anders behandeln als die externer Klassen?
    4) Neben dem Wohin verstehe ich auch noch nicht ganz das Wie. Hier würde mir eine Lösung für mein kurz skizziertes Beispiel denke ich die Augen öffnen und die Fragen 1-3 beantworten...


    Vielen Dank im Voraus!


    Gruß


    Marco

  • Dieser spezielle Fall ist ein ConfigurationChange und wird in der Doku erläutert.


    onPause() und onResume() werden meines Wissens bei einem Drehen des Gerätes nicht aufgerufen, da die Activity nicht verlassen wurde.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!