Zapobiegaj obracaniu ekranu na Androidzie


315

Mam jedno z moich działań, których nie chciałbym obracać, ponieważ uruchamiam AsyncTask, a obracanie ekranu powoduje jego ponowne uruchomienie.

Czy istnieje sposób, aby powiedzieć tej czynności „NIE OBRACAJ ekranu, nawet jeśli użytkownik trzęsie swoim telefonem jak szalony”?



11
Możesz poradzić sobie ze zmianą orientacji ekranu i AsyncTasks. Zapobieganie zmianom orientacji ekranu to tylko leniwe obejście. I nie jest trudno utrzymać AsyncTask przy zmianach orientacji :)
Romain Guy


56
O wiele bardziej pomocne byłoby dostarczenie rozwiązania lub kodu, Romain, niż stwierdzenie „rozwiązanie istnieje i nie jest trudne”.
Peter vdL

2
możesz użyć setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Odpowiedzi:


467

Dodaj

android:screenOrientation="portrait" 

lub

 android:screenOrientation="landscape" 

do <activity>elementu / ów w manifeście i gotowe.


95
Pamiętaj, że to po prostu ukrywa błąd w Twojej aplikacji, co zmniejsza ryzyko potknięcia się użytkownika. Ale nadal będą. Każda zmiana konfiguracji może spowodować ponowne uruchomienie aktywności. Naprawdę musisz poprawnie napisać swoją aktywność, aby poradzić sobie z zadaniem asynchronicznym podczas jego ponownego uruchamiania.
hackbod

1
To nie zadziałało w jednym przypadku. Przed otwarciem aplikacji ustawiłem ekran w pozycji poziomej. Kiedy otworzyłem aplikację, ekran obrócił się do pionu i spowodował drugie wywołanie asynctask.
user522559,

2
Musisz ustawić rzeczy, aby „otwierały się w trybie portretowym” ORAZ „zawsze pozostawały w trybie portretowym”. Wykonanie tylko 1 jest bezcelowe.
Carol

1
@hackbod, niezależnie od tego, jest to hit Google nr 1 w kategorii „Aplikacja na Androida zapobiegająca obracaniu ekranu”, moja potrzeba nie ma nic wspólnego z zadaniami asynchronicznymi
chiliNUT

7
@hackbod Jak zatem poprawnie zapisywać naszą aktywność, aby poradzić sobie z tym problemem?
user41805

127

Możesz śledzić poniżej logikę, aby zapobiec Automatyczne obracanie ekranu podczas swojej AsyncTaskjest uruchomiony:

  1. Zachowaj aktualną orientację ekranu w swojej aktywności za pomocą getRequestedOrientation().
  2. Wyłącz automatyczną orientację ekranu za pomocą setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Uruchom / wykonaj swój AsyncTask.
  4. Na koniec AsyncTaskprzywróć poprzedni status orientacji za pomocą setRequestedOrientation(oldOrientation).

Należy pamiętać, że istnieje kilka sposobów dostępu do Activitywłaściwości (które działają w wątku interfejsu użytkownika) w pliku AsyncTask. Możesz wdrożyć swoją AsyncTaskklasę wewnętrzną lub użyć wiadomości, Handlerktóra szturcha twoją Activiyklasę.


9
Znacznie lepiej niż wybrana odpowiedź.
Matej

3
świetny pomysł :) nie masz
zapisanej

To wydaje się niesamowite, @emre, dzięki! Wydaje się „Zbyt piękne, aby mogło być prawdziwe!” Zwróć uwagę na ogromną ilość dyskusji na ten temat: stackoverflow.com/q/3821423/294884 ... eksperci od Androida, czy jest tu jakaś wada ?! Jeszcze raz dziękuję .. bardzo.
Fattie

3
Bzdury!! To nie działa , jeśli urządzenie dzieje się rozpocząć w krajobrazie MODE. Co do cholery! Sux: O
Fattie

@ Emre, ten kod nie działa w niektórych przypadkach. Np. Jeśli użytkownik zmienił orientację między początkiem zadania AsyncTask a jego końcem. Wówczas zapisałeś i przywróciłeś niewłaściwą orientację.
Pacerier,

27

W pliku manifestu do każdego działania, które chcesz zablokować obrót ekranu, dodaj: jeśli chcesz zablokować go w trybie poziomym:

<activity
        ...
        ...
        android:screenOrientation="landscape">

lub jeśli chcesz zablokować go w trybie pionowym:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

Najłatwiejszym sposobem było to zrobić

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

w ramach onCreate, zaraz po

setContentView(R.layout.activity_main);

więc...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

7

Zamiast wchodzić w AndroidManifest, możesz po prostu to zrobić:

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

Jedyną wadą jest to, że wymaga interfejsu API na poziomie 18 lub wyższym. Więc w zasadzie jest to czubek włóczni.


Ta część wyłącza przycisk Strona główna i ostatnie aplikacje, a nawet po zwolnieniu blokady za pomocą SCREEN_ORIENTATION_FULL_SENSOR, jest w stanie wyłączonym. W Androidzie N.
kAmol

6

Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

2

Wystarczy następujący atrybut w AKTYWNOŚCI w AndroidManifest.xml:

android:configChanges="orientation"

Zatem pełny węzeł aktywności byłby:

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

1

Dodaj:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

Dodaj następujące elementy do pliku AndroidManifest.xml

[app> src> main> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

Przykład:

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

   <uses-permission android:name="A-PERMISSION" />

   <application>
      <activity android:name=".MainActivity"
                android:screenOrientation="portrait"
                android:configChanges="orientation">
      </activity>
   </application>

</manifest>

0

Jeśli używasz Android Developer Tools (ADT) i Eclipse , możesz przejść do AndroidManifest.xml -> zakładka Aplikacja -> zejść w dół i wybrać swoją aktywność. Na koniec wybierz preferowaną orientację. Możesz wybrać jedną z wielu opcji.


0

Musisz dodać następujący kod w pliku manifest.xml. Aktywność, dla której nie powinna się obracać, w tej aktywności dodaj ten element

android:screenOrientation="portrait"

Wtedy się nie obraca.


0

Możesz spróbować w ten sposób

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

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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=".Login_Activity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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


0

Użyj AsyncTaskLoader, aby zachować bezpieczeństwo danych, nawet jeśli aktywność ulegnie zmianie, zamiast AsyncTask, który jest lepszym sposobem na tworzenie aplikacji niż zapobieganie obracaniu ekranu.


0

Zapobiegaj rotacji ekranu, po prostu dodaj następujący wiersz do swoich manifestów.

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

To działa dla mnie.


0

Użytkownik "portrait"w pliku AndroidManifest.xml może wydawać się dobrym rozwiązaniem. Wymusza jednak na niektórych urządzeniach (które działają najlepiej w krajobrazie) przejście do pionu, nie uzyskując właściwej orientacji. W najnowszej wersji Androida wystąpi błąd. Więc moja sugestia jest lepsza w użyciu "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.