restart aktivita na otáčení Android

hlasů
1k

V mé aplikaci pro Android, když jsem se otáčet zařízení (vysouvací klávesnici), pak můj Activityrestartování ( onCreatese nazývá). Nyní, toto je pravděpodobně jak to mělo být, ale mám hodně počáteční zřízení v onCreatemetodě, takže musím buď:

  1. Dát všechny výchozí nastavení v jiné funkci, takže to není vše ztraceno na otočení přístroje nebo
  2. Ať je to tak onCreatenení zavolal znovu a uspořádání právě upravuje nebo
  3. Omezte aplikaci pouze na výšku, takže onCreatenení volána.
Položena 19/01/2009 v 01:28
zdroj uživatelem
V jiných jazycích...                            


32 odpovědí

hlasů
57

Co byste popsat, je výchozí chování. Musíte odhalit a tyto události sami zvládnout a dodává:

android:configChanges

vašich zjevných a pak změny, které chcete zvládnout. Takže pro orientaci, měli byste použít:

android:configChanges="orientation"

a klávesnice je otevření nebo zavření byste použili:

android:configChanges="keyboardHidden"

Chcete-li zvládnout obojí stačí oddělte pomocí příkazu trubky, jako je:

android:configChanges="keyboardHidden|orientation"

To spustí onConfigurationChanged metodu v jakékoliv aktivity říkáte. Pokud přepsat metodu, kterou lze předat do nové hodnoty.

Snad to pomůže.

Odpovězeno 19/01/2009 v 03:28
zdroj uživatelem

hlasů
885

Použití třídy Application

V závislosti na tom, co děláte ve svém inicializace byste mohli uvažovat o vytvoření nové třídy, která rozšiřuje Applicationa pohybem inicializační kód do překryté onCreatemetody v této třídě.

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

onCreateVe třídě aplikace se nazývá pouze tehdy, když je vytvořena celá aplikace, takže aktivita restartuje na orientaci nebo klávesnice změně viditelnosti, nespustí se.

Je dobrým zvykem vystavit instance této třídy jako jedináček a vystavení proměnné aplikace jste inicializace s použitím metody pro čtení a zápis.

Poznámka: Budete muset zadat název vaší nové třídy aplikace v manifestu, aby mohla být registrována a použita:

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

V reakci na změny konfigurace [UPDATE: to je zastaralý, protože API 13; viz doporučenou alternativou ]

Jako další alternativa, můžete mít svou aplikaci poslouchat události, které by mohly znamenat restart - jako je orientace a změnami viditelnosti klávesnice - a manipulovali s nimi v rámci vaší činnosti.

Začněte tím, že přidá android:configChangesuzel do svého manifestu uzlu Activity je

android:configChanges="keyboardHidden|orientation"

nebo pro Android 3.2 (na úrovni API 13) a novější :

android:configChanges="keyboardHidden|orientation|screenSize"

Pak v rámci aktivity přepsat onConfigurationChangedmetody a volání setContentViewpřinutit vzhled GUI být znovu provedeno v nové orientaci.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}
Odpovězeno 19/01/2009 v 09:47
zdroj uživatelem

hlasů
11

onCreateMetoda se dodnes nazývá, i když změníte orientationAndroid. Tak dojemné veškerou těžkou funkčnost této metody není ti pomůže

Odpovězeno 21/01/2010 v 11:40
zdroj uživatelem

hlasů
39

Právě jsem objevil tuto tradici:

Pro zachování aktivity při životě pomocí změny orientace a manipulace to přes onConfigurationChanged, dokumentace a ukázkový kód výše naznačují to v manifestu souboru:

android:configChanges="keyboardHidden|orientation"

která má navíc výhodu, že vždy funguje.

Bonus tradice je, že vynechání keyboardHiddense může zdát logické, ale to způsobí selhání v emulátoru (pro Android 2.1 přinejmenším): zadáním pouze orientationučiní emulátoru volání jak OnCreatea onConfigurationChangedněkdy, a to pouze OnCreatejiné časy.

Neviděl jsem poruchu na zařízení, ale slyšel jsem o emulátoru selhání pro ostatní. Tak to stojí za dokumentování.

Odpovězeno 22/12/2010 v 22:50
zdroj uživatelem

hlasů
93

to, co jsem udělal...

v manifestu, k části aktivita, která zní:

android:configChanges="keyboardHidden|orientation"

v kódu pro činnost, realizována:

//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();
}
Odpovězeno 04/01/2011 v 02:26
zdroj uživatelem

hlasů
33

Můžete také zvážit použití cestu platformě Android je přetrvávajících dat v rámci změny orientace: onRetainNonConfigurationInstance()a getLastNonConfigurationInstance().

To vám umožní přetrvávat dat napříč konfiguračních změn, jako jsou informace, které jste dostali od načtení serveru nebo něco jiného, který byl počítán onCreateani potom, a zároveň umožňuje Android znovu dispozic Activitypomocí XML souboru pro orientaci nyní v provozu ,

Viz zde nebo zde .

Je třeba poznamenat, že tyto metody jsou nyní zastaralé (i když stále pružnější než manipulace orientaci změnit sami sebe, protože většina z výše uvedených řešení navrhnout) s doporučením, aby se všichni přejít na Fragmentsa místo toho použít setRetainInstance(true)na každém Fragmentchcete zachovat.

Odpovězeno 22/09/2011 v 04:03
zdroj uživatelem

hlasů
12

Změny, které mají být provedené v Android manifestu jsou:

android:configChanges="keyboardHidden|orientation" 

Dodatky, které mají být vyrobeny v činnosti jsou:

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();
    }
}
Odpovězeno 11/11/2011 v 13:20
zdroj uživatelem

hlasů
13
 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

Jaká část manifestu jej říká „nevolají onCreate()“?

Také Dokumenty Google říkají, aby se zabránilo používání android:configChanges(s výjimkou v krajním případě) .... Ale pak alternativní metody, které vyvolávají dojem, všichni DO používat android:configChanges.

To byla moje zkušenost, že emulátor vždy volá onCreate()při otáčení.
Ale 1-2 zařízení, které jsem spustit stejný kód na ... ne. (Nejste si jisti, proč tam by byl nějaký rozdíl.)

Odpovězeno 01/02/2012 v 16:55
zdroj uživatelem

hlasů
173

Aktualizace pro Android 3.2 a vyšší:

Upozornění : Počínaje s operačním systémem Android 3.2 (na úrovni API 13), dále jen „velikost obrazovky“ se také změní , když přístroj se mezi orientací na výšku a na šířku. Takže pokud chcete, aby se zabránilo runtime restartuje kvůli změně orientace při vývoji na úrovni API 13 nebo vyšší (podle prohlášení parametr versionCode a targetSdkVersion atributů), je nutné zahrnout "screenSize"hodnotu navíc k "orientation"hodnotě. To znamená, že musí deklarovat android:configChanges="orientation|screenSize". Nicméně, pokud vaše aplikace cílí na úroveň API 12 nebo nižší, pak se vaše aktivita vždy zpracovává tuto konfiguraci změnu sám (tato změna konfigurace neobnoví svou činnost, i když běží na Android 3.2 nebo vyšším zařízení).

Odpovězeno 03/03/2012 v 22:56
zdroj uživatelem

hlasů
9

I když to není „způsob, jakým Android“ Získala jsem velmi dobré výsledky při manipulaci orientace se změní sám a jednoduše přemístit widgety v rámci cílem převzít změněnou orientaci v úvahu. To je rychlejší než jakýkoli jiný přístup, protože vaše názory nemusejí být uloženy a obnoveny. Poskytuje také další bezproblémové pro uživatele, protože respositioned widgety jsou naprosto stejné widgety, se přestěhoval a / nebo velikost. Nejen modelu stát, ale také zobrazit stav, může být zachována tímto způsobem.

RelativeLayoutNěkdy může být dobrou volbou pro zobrazení, které musí přeorientovat sebe čas od času. Právě jste poskytnout soubor portrétních rozložení params a sadu upravené rozvržení params, s různými pravidly relativní polohy na každém, pro každé dítě widgetu. Pak se ve svém onConfigurationChanged()způsobu, minete příslušný jeden k setLayoutParams()hovoru na každé dítě. Pokud je třeba některý kontrola dítě samo musí být vnitřně přeorientovat, stačí zavolat metodu k tomuto dítěti provést změnu orientace. Že dítě podobně volá metody na některý z jeho podřízených ovládacích prvků, které vyžadují vnitřní novou orientaci, a tak dále.

Odpovězeno 16/03/2012 v 10:13
zdroj uživatelem

hlasů
108

Místo toho se snaží zastavit onCreate()od vyhazovu vůbec, možná zkusit zaškrtnutím Bundle savedInstanceStatebyly přeneseny do akce, aby zjistili, zda je null nebo není.

Například, když mám nějakou logiku, který by měl být spuštěn, když Activityje skutečně vytvořen, ne při každé změně orientace, já jen spustit tuto logiku v onCreate()pouze v případě, že savedInstanceStateje nulový.

Jinak stále chci rozložení správně překreslit pro orientaci.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

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

Není si jistý, jestli je to konečná odpověď, ale funguje to pro mě.

Odpovězeno 04/08/2012 v 22:04