Mam aplikację, której chciałbym używać w trybie portretowym, więc zdefiniowałem Androida: screenOrientation = "portret" w pliku XML manifestu. Działa to OK dla telefonu HTC Magic (i zapobiega zmianie orientacji również w innych telefonach).
Ale mam problem z telefonem HTC G1, gdy otwieram sprzętową klawiaturę QWERTY (nie wirtualną). Moja aktywność pozostaje w trybie portretowym, ale wydaje się, że została zrestartowana i traci wszystkie swoje stany. Nie dzieje się tak w przypadku wersji HTC Hero .
Moja aplikacja jest dość duża, więc nie chcę, aby uruchamiała się ponownie i traciła wszystkie swoje stany po otwarciu klawiatury. Jak mogę temu zapobiec?
android
android-activity
android-orientation
Vidar Vestnes
źródło
źródło
Odpowiedzi:
Aktualizacja kwietnia 2013 r .: Nie rób tego. To nie był dobry pomysł w 2009 roku, kiedy po raz pierwszy odpowiedziałem na pytanie i to naprawdę nie jest dobry pomysł. Zobacz odpowiedź hackbod z powodów:
Unikaj przeładowywania aktywności za pomocą asynchronicznego zadania zmiany orientacji w Androidzie
Dodaj
android:configChanges="keyboardHidden|orientation"
do pliku AndroidManifest.xml. Mówi to systemowi, jakie zmiany konfiguracji poradzisz sobie sam - w tym przypadku nic nie robiąc.Aby uzyskać więcej informacji, zobacz Dokumentacja konfiguracji dewelopera
Aplikację można jednak przerwać w dowolnym momencie, np. Przez połączenie telefoniczne, dlatego naprawdę należy dodać kod, aby zapisać stan aplikacji po jej wstrzymaniu.
Aktualizacja: Począwszy od Androida 3.2, musisz również dodać „screenSize”:
Z podręcznika programisty Obsługa konfiguracji Zmień siebie
źródło
Musisz zmodyfikować plik AndroidManifest.xml, jak wspomniano o Intrications (wcześniej Ashton) i upewnić się, że działanie obsługuje zdarzenie onConfigurationChanged, tak jak chcesz. Tak powinno to wyglądać:
źródło
setRequestedOrientation()
inonCreate()
.onConfigurationChanged()
wywoływany wcześniej,onCreate()
jeśli więc ustawienie orientacji przed ustawieniem contentViews oncreate jest lepszym podejściem, ustawienie konfiguracji w miejscu, w którym należy, jest również czystsze, więc ta odpowiedź nadal jest dobra.Zawsze uważałem, że potrzebujesz obu
źródło
Jak powiedziano, zestaw
android:configChanges
Twojej aktywności (w pliku manifestu) do,keyboardHidden|orientation
a następnie:1) Zastąp
onConfigurationChanged()
2) Dodaj ten wiersz do swojej aktywności
onCreate()
To lepsze niż dodanie tej samej linii
onConfigurationChanged
, ponieważ aplikacja przełączy się w tryb pionowy, a następnie z powrotem w orientację poziomą (stanie się to tylko raz, ale jest denerwujące).Możesz także ustawić
android:screenOrientation="nosensor"
swoją aktywność (w manifeście). Ale w ten sposób nie jesteś w stanie obsłużyć zmian orientacji.źródło
Użyj tego..
źródło
W metodzie OnCreate swojej aktywności użyj tego kodu:
Teraz twoja orientacja zostanie ustawiona na pionową i nigdy się nie zmieni.
źródło
W pliku AndroidManifest.xml do każdego działania, które chcesz zablokować, dodaj ostatni
screenOrientation
wiersz:Lub Android: screenOrientation = "krajobraz" .
źródło
W pliku androidmanifest.xml :
lub
źródło
Aby zablokować ekran kodem, musisz użyć faktycznego obrotu ekranu (0, 90, 180, 270) i musisz znać jego naturalną pozycję, w smartfonie naturalną pozycją będzie portret i tablet, będzie krajobraz.
Oto kod (metody blokowania i odblokowywania), został przetestowany na niektórych urządzeniach (smartfonach i tabletach) i działa świetnie.
źródło
W Visual Studio Xamarin:
using Android.Content.PM;
do ciebie lista przestrzeni nazw aktywności.[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
jako atrybut twojej klasy, tak:
źródło
Dodaj
do twojego manifestu.
źródło
Pamiętaj, że żadna z metod nie działa teraz!
W Android Studio 1 jednym prostym sposobem jest dodanie
android:screenOrientation="nosensor"
.To skutecznie blokuje orientację ekranu.
źródło