Wechsel der Activity bei Drehung des Handys auf landscape

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wechsel der Activity bei Drehung des Handys auf landscape

    Hallo,

    ich bin ziemlich neuer Android App-Entwickler und versuche mich anhand vieler Anleitungen im Internet so einigermaßen durchzuwursteln. Nun aber komme ich definitiv nicht weite ;( . Ich möchte gerne, dass bei Drehung des Handy von Portrait auf Landscape automatisch eine andere Activity gestartet wird. Kann mir hierzu jemand helfen bzw. ein Bsp.code zukommen lassen?

    Wäre super.
  • Hi Sunshine,

    was genau hast du denn in deiner App vor? Falls es nur darum geht, dass das Design deiner App in Landscape und Portrait anders sein soll, braucht man dafür keine zweite Activity zu erstellen, sondern kann das über den Designer lösen. Viele verwenden für sowas auch Fragments, sodass sie den Bildschirm sinnvoll aufteilen können. Aber ich habe noch keine Fragments verwendet, deswegen weiß ich da nicht so viel drüber.

    Oder soll wirklich eine völlig andere Oberfläche in deiner App gestartet werden, wenn man das Handy dreht? Im Normalfall wird eine Activity bei einer Änderung der Bildschirmorientierung sowieso neu geladen, das heißt du könntest eigentlich einfach in der onCreate() die Bildschirmorientierung abfragen und je nachdem, was da rauskommt, weitermachen oder direkt mit einem Intent deine andere Activity starten.
    Grüße

    Robert
  • Hallo ja um nur das Layout umzustellen also ei anderes Layout im Landscape mod anzuzeigen reicht es eigentlich ein zweites horizontalees Layout zu erstellen. Dieses sollte aber die gleichen View Elemente haben wie das andere sonst werden natürlich die Button nicht gehen.
    Das Layout gehört dan in den Ordner layout_land und wird auch selber geladen wenn du Handy drehst.
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo zusammen,

    auf die Frage von Robert folgende Antwort. Meine Tochter ist Diabetikerin und hat eine Rechenschwäche. Vom daher habe ich eine APP entwickelt, wo sie berechnen kann, was sie beim Essen für ein bestimmtes ausgewähltes Nahrungsmittel an Insulin zu sich nehmen muss. Gerne hätte ich nun, dass sie beim Drehen des Handy auf ein weiteres Layout kommt, wo sie nicht nur eins sondern drei Nahrungsmittel erfassen kann und eine Gesamtinsulinmenge dabei heraus kommt. Dies habe ich nun mit einem Button gemacht. Schöner wäre es halt, dass das zweite Layout im landscape-Modus, welches schon vom ersten Layout im Portrait-Modus abweicht, durch drehen des Handy aktiviert wird.

    Bin leider nicht ganz so drin im Thema und von daher wäre ich für eine kleine Hilfe/Anleitung dankbar. Wo genau merkt das "Programm" dass das Handy gedreht wurde und führt einen bestimmten Befehl, hier Ausführung des zweiten Layouts, aus.
  • Hallo wenn du zwei Layouts hast eines für Vertikal und eines für Querformat und die auch in den richtigen ordnen sind geht das von alleine.
    Habe mal ein einfache Beispiel Projekt gemacht.

    Quellcode

    1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    2. Button b1;
    3. Button bH ,bV;
    4. TextView text;
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_main);
    9. b1 = findViewById(R.id.button);
    10. b1.setOnClickListener(this);
    11. text = findViewById(R.id.text);
    12. int orientation = getResources().getConfiguration().orientation;
    13. if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    14. // In landscape
    15. bV = findViewById(R.id.buttonH);
    16. bV.setOnClickListener(this);
    17. } else {
    18. // In portrait
    19. bH = findViewById(R.id.buttonV);
    20. bH.setOnClickListener(this);
    21. }
    22. }
    23. @Override
    24. public void onClick(View v) {
    25. switch (v.getId()){
    26. case R.id.button:
    27. text.setText(" --- ");
    28. break;
    29. case R.id.buttonH:
    30. text.setText("H");
    31. break;
    32. case R.id.buttonV:
    33. text.setText("V");
    34. break;
    35. }
    36. }
    37. }
    Alles anzeigen



    zum Layout schaue mal Hier
    Dateien
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Da du ja schon einen Button und auch zwei Activitys hast wäre es wohl am einfachsten die
    onSaveInstanceState Methode zu überschreiben.
    Diese wird gewöhnlich beim drehen des Handys aufgerufen.
    Wenn du nun da die orientieren abfragst und wenn es das gewünschte Format ist kannst du deine zweite Activity starten.

    Quellcode

    1. @Override
    2. protected void onSaveInstanceState(Bundle outState) {
    3. super.onSaveInstanceState(outState);
    4. int orientation = getResources().getConfiguration().orientation;
    5. if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    6. // In landscape
    7. }
    8. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo jogimuc,


    vielen Dank für die Antwort und die tolle Vorlage!


    Ich bin gerade dabei, diese zu verstehen. Woran erkennt die APP bzw. an welcher Stelle des Programmiercodes wird etwas ausgelöst, wenn das Handy gedreht wird. Entsprechend Deinem Beispiel sind ja nicht die Buttons dafür verantwortlich.


    Vielleicht noch zu meiner APP - ich habe eine MainActivity und eine Main2Activity mit jeweils einem zugehörenden Layout. Wenn ich also drehe, sollte im Landscape die Main2Activity und im Portrait die MainActivity gestartet werden.
  • Hallo
    beim drehen wird die Activity vom System neu gestartet und meistens auch die onCrate wieder duchlaufen.
    ist also so als würde die app neu gestartet.

    es wird auch beim derehen die onSaveInstanceState Methode durch laufen. wird vom system aufgerufen.



    Wie du im Letzen post von mir siehst mache ich dort eine Überrüfung in welcher position das Handy ist. Ist es der die du brauchst machst du deinen Intent.

    In der anderen Activity natürlich das selbe nur prüfst du da auf die andere Position. Und macht einen Intent zur ersten Avtivity.
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo jogiuc,

    danke nochmals für die Hilfe. Jetzt war ich mir ziemlich sicher, dass ich es hinbekomme. Zum meinem Frust dreht sich nun aber gar kein Layout mehr. Ich bin am verzweifeln....habe schon alles, was es mit fixer Orientation/Rotation in der Manifest.xml und in den Layouts geändert. Nix geht mehr.... :S Ich bin glaub zu blöd dafür.....woran könnte das liegen?
  • Hallo
    Dann zeige uns mal wie dein Layout aussieht und was du so im manifest eingestellt hast.


    Oder hast du vielleicht im Handy das Drehen ausgeschaltet? Drehen sich andere APPs?


    Wenn du schon zwei Activitys hattest und es mit Hilfe eines Buttons ging, dann brauchst du eigentlich nichts zu ändern am Layout. Anstatt den in Intent zum starten der zweiten Ativity in der onClick Methode zu machen, machst du das in der onSaveInstanceState wenn sich das Handy in der richtigen Position befindet. Den Button hättest du erstmal lassen können und wenn es richtig geht dann entfernen.
    Denke auch daran die Activity nach dem Intent mit Finish zu beenden.


    Wie gesagt ohne Code ist hier Hilfe nicht möglich denn hellsehen können wir noch nicht.
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo jogimuc,

    ich wollte schon den Code reinkopieren und dabei ist mir aufgefallen, dass meine Versionen MyApplication6 (Sicherungskopie meines stabilen Standes) und MyApplication7 irgendwie verwurstelt sind. Siehe Anlage obereste Zeile. Und daher gab es die zunächst nicht erklärbaren Drehprobleme.

    Habe dann Deine Ideen in meine 6er-Version eingebaut und NUN FUNKTIONIERT DAS GANZE SO WIE ICH WILL 8o 8o 8o

    Ich bin Dir für Deine Unterstützung mega dankbar!!! Echt klasse!

    Jogimuc for president :!:
    Bilder
    • Skizze.png

      191,92 kB, 2.462×224, 5 mal angesehen
  • Neu

    Hallo jogimuc,

    bitte erlaube mir noch eine weitere Anfängerfrage:

    Das mit dem Drehen mittels des Programmiercodes


    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    int orientation = getResources().getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // In landscape
    Intent intent = new Intent(MainActivity.this,Main2Activity.class);
    startActivity(intent);
    finish();
    }

    }klappt auf meinem Handy mit der Android-Version 7, aber nicht auf dem Handy meiner Tochter mit Android 8. Obwohl ich bei project structure Min SDK Version API 23 und Target API 26 angegeben habe. Woran könnte es liegen?
  • Neu

    Hallo kann ich dir leider nicht so einfach beantworten.


    Bei mir geht das auch unter Android 9 ich wüsste nicht was sich da geändert haben soll.



    Nur musst du eigentlich in der ersten Activity auf ORIENTATION_PORTRAIT Prüfen da ja zu dem Zeitpunkt wo die Methode aufgerufen wird sich das Handy noch Hochkant befindet. Denn die Methode wird vor dem neu starten der Actvity aufgerufen um den Status zu speichern. In der Zweiten Activity müsstest du auf ORIENTATION_LANDSCAPE Prüfen.Bei mir geht das ohne Probleme.
    Ein Feedback auf Tipps ist auch schön. :P
  • Neu

    Hallo,

    wenn ich auf der MainActivity auf Orientation_Portrait prüfe und dann mittels

    Intent intent = new Intent(MainActivity.this,Main2Activity.classdie MainActivity belasse, komme ich beim Drehen auf Landscape doch eigentlich nie auf die Main2Activity oder?

    Zumindest passiert dies bei der Programmänderung jetzt. Es dreht sich nur die erste Activity. Muss ich noch etwas in der Manifest.xml vorgeben?
  • Neu

    Hallo

    Ok es scheint sich wirklich etwas an der onSaveInstanceState Methode am Android 8 getan zu haben.

    Bei Android 9 wird die Methode oft sogar zweimal durchlaufen.

    Deshalb habe ich die abfrage in der onCreate in meiden Activitys.

    Hier mein Projekt was bei mir vom Android 5 bis 9 läuft.
    Dateien
    Ein Feedback auf Tipps ist auch schön. :P