2011-11-01 10 views

Odpowiedz

18

W tagu Aktywny oczywistego zapisu

android: configChanges = "orientacja | Rozmiar ekranu"

przykład:

<activity android:name=".MainActivity" 
      android:configChanges="orientation|screenSize"> 
+10

Ostrzeżenie: Począwszy od wersji Android 3.2 (poziom interfejsu 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 środowiska wykonawczego z powodu zmiany orientacji podczas programowania dla poziomu API 13 lub wyższego (jak zadeklarowały atrybuty minSdkVersion i targetSdkVersion), oprócz wartości "orientacja" musisz uwzględnić wartość "screenSize". Oznacza to, że musisz odcyfrować android: configChanges = "orientation | screenSize". (http://developer.android.com/guide/topics/resources/runtime-changes.html) – Rubix

+0

Przyjemne informacje Rubix. +1 –

+0

Rubix: Co oznacza tutaj orientacja i wartość ScreenSize. Pytanie dotyczy tylko mojej ciekawości. – vgokul129

1

W manifeście.xml dodaj android: configChanges = "orientation" dla działania.

3

Zastosowanie sprawdzenie flagi onCreate. Dokonaj flag = true w momencie inicjalizacji/deklaracja dodać androida: configChanges = „orientacji” w ur pliku manifestu

ur pliku java przesłonić onConfigurationChanged sposób i uczynić Zaznacz jako fałszywe.

Po zrobieniu tego ur na nowo zostanie wywołany, ale kod wspomina w , jeśli nie zostanie wywołany. Przenieś kod ur w stanie , jeśli stanie.

spróbuj tego użyć.

static boolean flag = true; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    if(flag) 
     Log.d("ONCREATE", "flag is true"); 
}  
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // TODO Auto-generated method stub 
    Log.d("ONCONFIGCHANGE", "CALLED"); 
    flag = false; 
    super.onConfigurationChanged(newConfig); 
} 
3

Alternatywne podejście jest wykorzystanie onSaveInstanceState sposobu zapisywania danych innych niż trwałe w wiązkę. Stan powinien zostać przywrócony w onRestoreInstanceState lub w onCreate. W onCreate musisz przeanalizować parametr savedInstanceState, a jeśli nie jest zerowy, powinieneś przywrócić wcześniej zapisany stan.

2

To rozwiązanie jest zdecydowanie najlepsze. w pliku manifestu dodać

<activity 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:name="your activity name" 
     android:label="@string/app_name" 
     android:screenOrientation="landscape"> 
     </activity 

I klasa aktywność dodać następujący kod

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
     //do your stuff here 
     // 
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    //do your stuff here 

    } 
} 
-1

dla C# Xamarin mam z tego rozwiązania:

using System.Collections.Concurrent; 


public static class ObjectExchanger 
{ 
    private static ConcurrentDictionary<string, object> ObjectList = new ConcurrentDictionary<string, object>(); 

    /// <summary> 
    /// Add key and object. Do not add the same key twice. 
    /// </summary> 
    /// <param name="key"></param> 
    /// <param name="obj"></param> 
    public static void Add(string key, object obj) 
    { 
     ObjectList.GetOrAdd(key, obj); 
    } 

    /// <summary> 
    /// Get object via key. Do net Get twice. Key/object will remove after get it once. 
    /// </summary> 
    /// <param name="key"></param> 
    public static object Get(string key) 
    { 
     object obj = null; 

     ObjectList.TryRemove(key, out obj); 

     return obj; 
    } 
} 

można używać w w onCreate Metoda tworzenia kopii zapasowych i przywracania danych dla aktywności po rotacji.

Powiązane problemy