Aktywność uruchom ponownie przy rotacji Androida

W mojej aplikacji na Androida, gdy obracam urządzenie (wysuwam klawiaturę), to mój Activity jest restartowany (onCreate jest wywoływany). Teraz pewnie tak powinno być, ale robię wiele początkowych ustawień w metodzie onCreate, więc potrzebuję albo:

  1. Umieść wszystkie początkowe ustawienia w innej funkcji, aby nie wszystkie zostały utracone podczas obracania urządzenia lub
  2. Make it so onCreate is not called again and the layout just adjusts or
  3. Ogranicz aplikację tylko do portretu, aby onCreate nie jest wezwany.
Author: JJD, 2009-01-19

30 answers

Korzystanie z klasy aplikacji

W zależności od tego, co robisz podczas inicjalizacji, możesz rozważyć utworzenie nowej klasy rozszerzającej Application i przeniesienie kodu inicjalizacji do nadpisanej metody onCreate wewnątrz tej klasy.

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

onCreate w klasie aplikacji jest wywoływana tylko wtedy, gdy cała aplikacja jest utworzona, więc aktywność restartuje się po zmianie orientacji lub widoczności klawiatury nie spowoduje jej uruchomienia.

To dobra praktyka, aby wyeksponuj instancję tej klasy jako singleton i wyeksponuj zmienne aplikacji, które inicjujesz za pomocą getterów i setterów.

UWAGA: Musisz podać nazwę nowej klasy aplikacji w manifeście, aby została zarejestrowana i użyta:

<application
    android:name="com.you.yourapp.MyApplicationClass"

Reagowanie na zmiany konfiguracji [Aktualizacja: jest to przestarzałe od API 13; zobacz zalecaną alternatywę]

Jako kolejną alternatywę, możesz mieć aplikacja nasłuchuje zdarzeń, które mogłyby spowodować ponowne uruchomienie – takich jak zmiana orientacji i widoczności klawiatury – i obsługuje je w ramach aktywności.

Zacznij od dodania węzła android:configChanges do węzła manifestu Twojej aktywności

android:configChanges="keyboardHidden|orientation"
[11]}lub dla Android 3.2 (poziom API 13) i nowszy:
android:configChanges="keyboardHidden|orientation|screenSize"

Następnie w ramach Działania nadpisuje metodę onConfigurationChanged i wywołuje setContentView, aby wymusić ponowne wykonanie układu GUI w nowej orientacji.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}
 904
Author: Reto Meier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19

Aktualizacja dla Androida 3.2 i nowszych:

Uwaga : począwszy od systemu Android 3.2 (poziom API 13), "Rozmiar ekranu" zmienia się również, gdy urządzenie przełącza się między orientacją pionową i poziomą. Tak więc, jeśli chcesz zapobiec ponownemu uruchomieniu runtime z powodu zmiany orientacji podczas tworzenia dla poziomu API 13 lub wyższego (zadeklarowanego przez atrybuty minSdkVersion i targetSdkVersion), musisz dodać wartość "screenSize" oprócz wartości "orientation". Oznacza to, że musisz declare android:configChanges="orientation|screenSize". Jeśli jednak Twoja aplikacja ma poziom API 12 lub niższy, Twoja aktywność zawsze obsługuje tę zmianę konfiguracji samodzielnie(ta zmiana konfiguracji nie uruchamia ponownie Twojej aktywności, nawet jeśli jest uruchomiona na urządzeniu z systemem Android 3.2 lub wyższym).

 178
Author: Gorm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-03 21:56:40

Zamiast próbować powstrzymać onCreate() przed całkowitym zwolnieniem, może spróbuj sprawdzić Bundle savedInstanceState jest przekazywane do zdarzenia, aby sprawdzić, czy jest null, czy nie.

Na przykład, jeśli mam jakąś logikę, która powinna być uruchomiona, gdy Activity jest naprawdę utworzona, a nie przy każdej zmianie orientacji, uruchamiam tę logikę w onCreate() tylko wtedy, gdy savedInstanceState jest null.

W przeciwnym razie nadal chcę, aby układ został odpowiednio wyrysowany dla orientacji.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

Nie wiem, czy jest to ostateczny odpowiedz, ale mi to odpowiada.

 113
Author: nebulae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-23 02:24:40

Co zrobiłem...

W manifeście, do sekcji Aktywność, Dodano:

android:configChanges="keyboardHidden|orientation"

W kodzie działania, zaimplementowany:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}
 93
Author: Someone Somewhere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-04 01:26:44

To, co opisujesz, jest domyślnym zachowaniem. Musisz wykryć i obsłużyć te zdarzenia samodzielnie, dodając:

android:configChanges

Do manifestu, a następnie zmian, które chcesz obsłużyć. Więc dla orientacji użyłbyś:

android:configChanges="orientation"

A do otwierania lub zamykania klawiatury używasz:

android:configChanges="keyboardHidden"

JeĹ "li chcesz obsĹ' ugiwaÄ ‡ oba moĹźesz po prostu oddzieliÄ ‡ je poleceniem pipe np:

android:configChanges="keyboardHidden|orientation"

Spowoduje to uruchomienie metody onConfigurationChanged w dowolnej aktywności ty zadzwoń. Jeśli nadpisujesz metodę, możesz przekazać nowe wartości.

Mam nadzieję, że to pomoże.
 59
Author: GregD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 02:28:45

Właśnie odkryłem tę wiedzę:

Za podtrzymywanie aktywności poprzez zmianę orientacji, a prowadzenie jej przez onConfigurationChanged, Dokumentacja i przykład kodu powyżej sugerują to w pliku manifestu:

android:configChanges="keyboardHidden|orientation"
Która ma tę dodatkową zaletę, że zawsze działa.

Bonus polega na tym, że pominięcie keyboardHidden może wydawać się logiczne, ale powoduje błędy w emulatorze (przynajmniej dla Androida 2.1): podanie tylko orientation spowoduje wywołanie emulatora zarówno OnCreate i onConfigurationChanged Czasami, a tylko OnCreate innym razem.

Nie widziałem awarii na urządzeniu, ale słyszałem o awarii emulatora dla innych. Więc warto to udokumentować.

 39
Author: Liudvikas Bukys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26

Możesz również rozważyć użycie sposobu przechowywania danych przez platformę Android w przypadku zmian orientacji: onRetainNonConfigurationInstance() i getLastNonConfigurationInstance().

Pozwala to na utrwalanie danych w trakcie zmian konfiguracji, takich jak informacje uzyskane z serwera lub coś innego, co zostało obliczone w onCreate lub od tego czasu, jednocześnie pozwalając Androidowi Na ponowne ułożenie Activity przy użyciu pliku xml do orientacji, która jest obecnie używana.

Zobacztutaj lubtutaj .

Powinno należy zauważyć, że metody te są obecnie przestarzałe (chociaż nadal bardziej elastyczne niż obsługa zmiany orientacji samodzielnie, jak sugeruje większość powyższych rozwiązań) z zaleceniem, aby wszyscy przełączyli się na Fragments i zamiast tego używali setRetainInstance(true) na każdym Fragment, który chcesz zachować.

 33
Author: Jon O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-10 20:48:22

Podejście jest użyteczne, ale jest niekompletne przy użyciu fragmentów.

Fragmenty są zwykle odtwarzane po zmianie konfiguracji. Jeśli nie chcesz, aby tak się stało, użyj

setRetainInstance(true); w konstruktorze (- ach) fragmentu

Spowoduje to zachowanie fragmentów podczas zmiany konfiguracji.

Http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

 28
Author: Abdo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 07:24:13

Po prostu dodałem

     android:configChanges="keyboard|keyboardHidden|orientation"

W pliku manifestu i nie dodałem żadnej metody onConfigurationChanged w mojej aktywności.

Więc za każdym razem, gdy klawiatura wysuwa się lub nic się nie dzieje.

 21
Author: bass.t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-19 10:52:05
 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)
Która część manifestu mówi "nie dzwoń"?

Także, Dokumenty Google mówią, aby unikać używania android:configChanges (z wyjątkiem ostateczności).... Ale wtedy alternatywne metody sugerują wszystkie czy używać android:configChanges.

Z mojego doświadczenia wynika, że emulator zawsze wywołuje onCreate() po rotacji.
Ale urządzenia 1-2, na których uruchamiam ten sam kod... nie. (Nie wiem, dlaczego miałaby być jakaś różnica.)

 13
Author: Carol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 10:31:17

Dodaj ten wiersz do manifestu: -

android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"

I ten fragment do aktywności:-

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
 13
Author: Parin Parikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 04:57:15

Zmiany, które należy wprowadzić w manifeście Androida to:

android:configChanges="keyboardHidden|orientation" 

Dodatki do wykonania wewnątrz aktywności to:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
 12
Author: sumit pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 07:39:59

Metoda onCreate jest nadal wywoływana nawet po zmianie orientation Androida. Więc przeniesienie wszystkich ciężkich funkcji do tej metody nie pomoże ci

 12
Author: ganesh krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 09:43:40

Umieść poniższy kod wewnątrz twojego znacznika <activity> w Manifest.xml:

android:configChanges="screenLayout|screenSize|orientation"
 12
Author: Vaishali Sutariya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 05:49:07

Istnieje kilka sposobów, aby to zrobić:

Zapisz Stan Aktywności

Możesz zapisać stan aktywności w onSaveInstanceState.

@Override
public void onSaveInstanceState(Bundle outState) {
    /*Save your data to be restored here
    Example : outState.putLong("time_state", time); , time is a long variable*/
    super.onSaveInstanceState(outState);
}

A następnie użyj bundle, aby przywrócić stan.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState!= null){
       /*When rotation occurs
        Example : time = savedInstanceState.getLong("time_state", 0); */
    } else {
      //When onCreate is called for the first time
    }
}

Samodzielnie obsługuj zmiany orientacji

Inną alternatywą jest samodzielna obsługa zmian orientacji. Nie jest to jednak uważane za dobrą praktykę.

Dodaj to do swojego pliku manifestu.

android:configChanges="keyboardHidden|orientation"

Dla Androida 3.2 i później:

android:configChanges="keyboardHidden|orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portarit mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

Ogranicz rotację

Możesz także ograniczyć aktywność do trybu pionowego lub poziomego, aby uniknąć rotacji.

Dodaj to do tagu aktywności w pliku manifestu:

        android:screenOrientation="portrait"

Lub zaimplementuj to programowo w swojej aktywności:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
 11
Author: Piyush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 14:00:27

Jest to bardzo proste, wystarczy wykonać następujące kroki:

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

To działa dla mnie:

Uwaga: orientacja zależy od Twojego zapotrzebowania

 11
Author: ManiTeja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 15:04:39

Sposób, w jaki znalazłem, to użycie onRestoreInstanceState i onSaveInstanceState zdarzeń, aby zapisać coś w Bundle (nawet jeśli nie potrzebujesz zapisywania żadnych zmiennych, po prostu włóż coś tam, aby Bundle nie było puste). Następnie w metodzie onCreate sprawdź, czy Bundle jest pusta, a jeśli tak, to zrób inicjalizację, jeśli nie, to zrób to.

 10
Author: Shaun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 15:33:58

Mimo, że nie jest to "sposób na Androida", uzyskałem bardzo dobre wyniki, sam obsługując zmiany orientacji i po prostu zmieniając pozycję widżetów w widoku, aby wziąć pod uwagę zmienioną orientację. Jest to szybsze niż jakiekolwiek inne podejście, ponieważ twoje poglądy nie muszą być zapisywane i przywracane. Zapewnia również bardziej bezproblemową obsługę dla użytkownika, ponieważ respositioned widgets są dokładnie takie same widgety, po prostu przeniesione i / lub zmienić rozmiar. Nie tylko stan modelu, ale także widok Stan, mogą być zachowane w ten sposób.

RelativeLayout czasami może być dobrym wyborem dla widoku, który musi się zmieniać od czasu do czasu. Wystarczy podać zestaw param układu pionowego i zestaw param układu krajobrazu, z różnymi względnymi regułami pozycjonowania dla każdego widżetu potomnego. Następnie, w swojej metodzie onConfigurationChanged(), przekazujesz odpowiednią do wywołania setLayoutParams() każdego dziecka. Jeśli Dowolna kontrola nad dzieckiem musi być wewnętrznie przeorientowana, wystarczy wywołać metodę na to dziecko do przeprowadzenia reorientacji. To dziecko w podobny sposób wywołuje metody na dowolnym z jego kontrolek potomnych, które wymagają wewnętrznej reorientacji i tak dalej.

 9
Author: Carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-31 02:44:30

Uwaga: zamieszczam tę odpowiedź, jeśli ktoś w przyszłości spotka się z tym samym problemem co ja. Dla mnie nie wystarczyła następująca linijka:

android:configChanges="orientation"

Kiedy obróciłem ekran, metoda ' onConfigurationChanged (Konfiguracja newConfig) nie została wywołana.

Rozwiązanie: musiałem również dodać "screenSize", nawet jeśli problem miał związek z orientacją. Więc w AndroidManifest.XML-file, add this:

android:configChanges="keyboardHidden|orientation|screenSize"

Następnie zaimplementuj metodę onConfigurationChanged(Configuration newConfig)

 6
Author: iHank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 14:46:44

Musisz użyć metody onSavedInstanceState, aby zapisać całą wartość do jej parametru is has that is bundle

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

I używać

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

Aby pobrać i ustawić wartość view objects będzie obsługiwał obroty ekranu

 5
Author: koteswara D K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 10:23:07

Za każdym razem, gdy ekran jest obrócony, Otwarta aktywność jest zakończona, a onCreate() jest wywoływana ponownie.

1 . Możesz zrobić jedną rzecz, zapisać stan aktywności, gdy ekran jest obrócony, tak, że można odzyskać wszystkie stare rzeczy, gdy activity ' s OnCreate () jest wywoływana ponownie. Refer this link

2 . Jeśli chcesz zapobiec ponownemu uruchomieniu aktywności, po prostu umieść następujące linie w manifeście.plik xml.

  <activity android:name=".Youractivity"
  android:configChanges="orientation|screenSize"/>
 5
Author: Mansuu....,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:43

W sekcji aktywności manifest dodaj:

android:configChanges="keyboardHidden|orientation"
 3
Author: Richard K Maleho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 20:25:57

Dodaj tę linię android: configChanges= " orientation|screenSize" in manifest

 3
Author: Vikramsinh Gaikwad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 12:42:56

Po chwili prób i błędów znalazłem rozwiązanie, które pasuje do moich potrzeb w większości sytuacji. Oto kod:

Konfiguracja manifestu:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.pepperonas.myapplication">

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

Główna aktywność:

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private Fragment mFragment;

    private int mSelected = -1;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate  " + "");

        // null check not realy needed - but just in case...
        if (savedInstanceState == null) {

            initUi();

            // get an instance of FragmentTransaction from your Activity
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            /*IMPORTANT: Do the INITIAL(!) transaction only once!
            * If we call this everytime the layout changes orientation,
            * we will end with a messy, half-working UI.
            * */
            mFragment = FragmentOne.newInstance(mSelected = 0);
            fragmentTransaction.add(R.id.frame, mFragment);
            fragmentTransaction.commit();
        }
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged  " +
                   (newConfig.orientation
                    == Configuration.ORIENTATION_LANDSCAPE
                    ? "landscape" : "portrait"));

        initUi();

        Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
        makeFragmentTransaction(mSelected);
    }


    /**
     * Called from {@link #onCreate} and {@link #onConfigurationChanged}
     */
    private void initUi() {
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate  instanceState == null / reinitializing..." + "");
        Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
        Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
        btnFragmentOne.setOnClickListener(this);
        btnFragmentTwo.setOnClickListener(this);
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME!!!");
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME, AS WELL!!!");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume  " + "");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause  " + "");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy  " + "");
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn_fragment_one:
                Log.d(TAG, "onClick btn_fragment_one " + "");
                makeFragmentTransaction(0);
                break;

            case R.id.btn_fragment_two:
                Log.d(TAG, "onClick btn_fragment_two " + "");
                makeFragmentTransaction(1);
                break;

            default:
                Log.d(TAG, "onClick  null - wtf?!" + "");
        }
    }


    /**
     * We replace the current Fragment with the selected one.
     * Note: It's called from {@link #onConfigurationChanged} as well.
     */
    private void makeFragmentTransaction(int selection) {

        switch (selection) {
            case 0:
                mFragment = FragmentOne.newInstance(mSelected = 0);
                break;
            case 1:
                mFragment = FragmentTwo.newInstance(mSelected = 1);
                break;
        }

        // Create new transaction
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frame, mFragment);

        /*This would add the Fragment to the backstack...
        * But right now we comment it out.*/
        //        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

}

I przykładowy Fragment:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {

    private static final String TAG = "FragmentOne";


    public static Fragment newInstance(int i) {
        Fragment fragment = new FragmentOne();
        Bundle args = new Bundle();
        args.putInt("the_id", i);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView  " + "");
        return inflater.inflate(R.layout.fragment_one, container, false);
    }

}

Można znaleźć na github.

 2
Author: Martin Pfeffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-30 03:53:29

Użyj słuchacza orientation do wykonywania różnych zadań na różnych orientacjach.

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
    super.onConfigurationChanged(myConfig);
    int orient = getResources().getConfiguration().orientation; 
    switch(orient) 
    {
       case Configuration.ORIENTATION_LANDSCAPE:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
       case Configuration.ORIENTATION_PORTRAIT:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
       default:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}
 2
Author: Akshay Paliwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 09:42:01

Umieść poniższy kod w swoim Activity w Android Manifest.

android:configChanges="orientation"

To nie uruchomi ponownie Twojej aktywności, gdy zmienisz orientację.

 2
Author: Pratik Dasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 09:42:36

Napraw orientację ekranu (poziomą lub pionową) w AndroidManifest.xml

android:screenOrientation="portrait" lub android:screenOrientation="landscape"

W tym celu twoja metoda onResume() nie jest wywoływana.

 2
Author: Brajendra Pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 09:43:12

Ludzie mówią, że powinieneś używać

android:configChanges="keyboardHidden|orientation"

Ale najlepszym i najbardziej profesjonalnym sposobem obsługi rotacji w Androidzie jest użycie klasy Loader. To nie jest słynna Klasa( Nie wiem dlaczego), ale jest o wiele lepsza niż AsyncTask. Aby uzyskać więcej informacji, zapoznaj się z samouczkami na Androida znajdującymi się w kursach Udacity na Androida.

Oczywiście w inny sposób można zapisać wartości lub widoki za pomocą onSaveInstanceState i odczytać je za pomocą onRestoreInstanceState. To zależy od naprawdę.

 2
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 07:55:58

Możesz zablokować bieżącą orientację ekranu za pomocą tego kodu...

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
 0
Author: Rashid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 06:23:17

Możesz użyć obiektu ViewModel w swojej aktywności.

Obiekty ViewModel są automatycznie zatrzymywane podczas zmian konfiguracji, dzięki czemu przechowywane w nich dane są natychmiast dostępne dla następnej aktywności lub wystąpienia fragmentu. Czytaj więcej:

Https://developer.android.com/topic/libraries/architecture/viewmodel

 0
Author: Gregory Buiko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 16:24:38