Frage

Ich versuche, einen Weg zu finden, um eine Aktivität einzurichten, bei der ihre Ausrichtung aus Daten in der Absicht ermittelt wird, die sie gestartet hat. Dies gilt für ein Spiel, in dem der Benutzer Levels auswählen kann, von denen einige int -Porträtorientierung und einige Landschaftsorientierung sind. Das Problem, mit dem ich ausgesetzt bin, ist das setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) Nimmt nicht wirksam, wenn die Aktivität voll beladen ist. Dies ist ein Problem für mich, weil ich während des Starts eine Lade- und Bildverarbeitung durchführe, was ich nur einmal machen möchte.

Derzeit, wenn der Benutzer eine Landschaftsniveau ausgewählt hat:

  • Die Aktivität beginnt OnCreate (), was dem Porträt fauert
  • Entdeckt aus der Analyse seiner Startabsicht, dass es sich in der Landschaftsausrichtung befinden sollte
  • Fortsetzung unabhängig von bis hin zu OnResume (), laden Informationen und andere Einrichtungsaufgaben aus
  • Zu diesem Zeitpunkt beginnt die SetRequestedorientation ein, sodass die Anwendung onPause () bis onDestroy () überläuft
  • Es startet dann erneut von OnCreate () und läuft zu OnResume (), um das Setup von früher zu wiederholen

Gibt es eine Möglichkeit, dies zu vermeiden und das Laden nicht zweimal durchzuführen? Im Idealfall wurde die Aktivität im Idealfall wissen, bevor sogar Oncreate abhängig von einer Eigenschaft der Startabsicht Landschaft oder Porträt sein sollte, aber es sei denn, ich habe etwas verpasst, das nicht möglich ist. Ich habe es geschafft, einen Weg zu hacken, um das Laden zu vermeiden, indem ich a überprüft habe boolean Vor den zeitaufwändigen Ladeschritten, aber das scheint nicht der richtige Weg, dies zu tun. Ich stelle mir vor, ich könnte überschreiben onSaveInstanceState, Aber das würde eine Menge zusätzlicher Codierung erfordern. Gibt es eine einfache Möglichkeit, dies zu tun?

Vielen Dank!


Lösung:

Laut Daniels Antwort war dies eigentlich ziemlich einfach zu reparieren. Ich musste nur ein paar kleine Änderungen vornehmen. In meiner "Menü" -Aktivität, bei der der Spieler auswählte, welches Level ich spielen soll, musste ich nur einen if/sonst überprüfen, um auszuwählen, welche Klasse mit meiner Absicht gestartet wird. Dies geschah mit einem einfachen INT, das Porträt oder Landschaft darstellt, als der Spieler ein Level ausgewählt hat. Ich habe dann eine zweite Klasse erstellt, die meine "Gamelogic" -Klasse erweitert. Dies ist die Klasse, die den größten Teil des Code für das Spiel selbst und nicht die Menüs, Anweisungen usw. enthielt.

public class GameLandscape extends GameLogic{
}

Buchstäblich so einfach und völlig leer. Auf diese Weise erbte es den gesamten Code aus meiner vorherigen Aktivität, wo ich ihn bereits codiert hatte, um die Dinge je nach Ausrichtung unterschiedlich zu handhaben. Zuletzt musste ich nur eine Grenze zum Manifest hinzufügen, in dem Gamelandscape immer in der Landschaft laufen würde und Gamelogic immer im Porträt laufen würde.

Also ein einfaches Problem in der Tat.

War es hilfreich?

Lösung

Sie können zwei Aktivitäten durchführen - eine für Porträtniveaus, die andere für Landschaftsniveaus - und dann die Ausrichtung der Aktivität in Androidmanifest.xml unter Verwendung der Aktivität festlegen android:screenOrientation Attribut. Sie müssen den Code nicht einmal duplizieren, wenn Sie die Vererbung verwenden. Verwenden Sie Ihre aktuelle Aktivität als Grundaktivität und erstellen Sie einfach die Landschafts-/Porträtaktivitäten als Unterklassen dieser Aktivität.

Ich denke Dann leiten Sie es an die richtige Aktivität weiter.

Andere Tipps

Sie können auch überschreiben onRetainNonConfigurationInstance(). Auf diese Weise können Sie vorübergehend einen Artikel speichern, den Sie durch Anrufe abrufen können getLastNonConfigurationInstance(). Auf diese Weise können Sie alle Dinge laden, die Sie brauchen und in Ihrem onRetainNonConfigurationInstance() Methode Sie können alles in einer Datenstruktur speichern und zurückgeben. Das in deinem onCreate() Du kannst anrufen getLastNonConfigurationInstance() Und wenn das Null -Last zurückgibt, laden Sie alle Ihre Sachen, wenn es etwas zurückgibt, dann haben Sie alles geladen. Hier ist ein kurzes Beispiel:

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top