Mam aplikację, która działa tylko w trybie portretowym i wprowadziłem zmiany w moim pliku manifestu dla każdego działania na orientację portretową. Ale kiedy obracam urządzenie, aktywność odtwarza się ponownie. Jak nie zniszczyć aktywności?
Mam aplikację, która działa tylko w trybie portretowym i wprowadziłem zmiany w moim pliku manifestu dla każdego działania na orientację portretową. Ale kiedy obracam urządzenie, aktywność odtwarza się ponownie. Jak nie zniszczyć aktywności?
Odpowiedzi:
Dla API 12 i starszych : dodaj
android:configChanges="orientation"
Dodaj „screenSize”, jeśli celujesz w interfejs API 13 lub nowszy, ponieważ przy każdej zmianie orientacji zmienia się również rozmiar ekranu, w przeciwnym razie nowe urządzenia będą nadal niszczyć Twoją aktywność. Zobacz odpowiedź Egg poniżej, aby uzyskać więcej informacji na temat korzystania z opcji „screenSize”
android:configChanges="orientation|screenSize"
do swojej aktywności w AndroidManifest.xml. W ten sposób Twoja aktywność nie zostanie automatycznie ponownie uruchomiona. Więcej informacji znajdziesz w dokumentacji
Z oficjalnego dokumentu flurin powiedział:
Uwaga: jeśli aplikacja jest przeznaczona dla interfejsu API na poziomie 13 lub wyższym (zgodnie z deklaracją w atrybutach minSdkVersion i targetSdkVersion), należy również zadeklarować konfigurację „screenSize”, ponieważ zmienia się ona również, gdy urządzenie przełącza się między orientacją pionową i poziomą.
Jeśli więc Twoja aplikacja jest skierowana na poziom interfejsu API 13 lub wyższy, należy zamiast tego ustawić tę konfigurację:
android:configChanges="orientation|screenSize"
Właściwe rozwiązanie to
android:configChanges="orientation|screenSize"
Dokumentacja Androida:
Aktualnie dostępny rozmiar ekranu uległ zmianie. Oznacza to zmianę aktualnie dostępnego rozmiaru w stosunku do aktualnego współczynnika proporcji, więc zmieni się, gdy użytkownik przełączy się z trybu poziomego na pionowy. Jeśli jednak aplikacja jest przeznaczona dla interfejsu API na poziomie 12 lub niższym, aktywność zawsze sama obsługuje tę zmianę konfiguracji (ta zmiana konfiguracji nie powoduje ponownego uruchomienia działania, nawet jeśli jest uruchomiona na urządzeniu z systemem Android 3.2 lub nowszym). *
Trochę to pogmatwałem, a potem powtórzyłem, że w pliku manifestu umieszczałem configChanges na poziomie aplikacji, a nie na poziomie aktywności. Oto jak wygląda kod, gdy działa poprawnie.
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
Teraz, gdy Android obsługuje podzielony ekran („wiele okien” w języku Androida), prawdopodobnie będziesz chciał dodać również screenSize | smallestScreenSize | screenLayout | orientację. Aby obsłużyć rotację i podzielony ekran, potrzebujesz czegoś takiego w Androidzie: configChanges
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
Spójrz na ten kod w pływającym obrazie. Ma najbardziej interesujący sposób obsługi obracania ekranu. http://code.google.com/p/floatingimage/source/browse/#svn/trunk/floatingimage/src/dk/nindroid/rss/orientation
napisz w manifest:
android:configChanges="orientation|screenSize|keyboardHidden"
i zastąp to w działaniu, które rozwiązało Twój problem:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}