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”?

Sephy
źródło
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.

lbedogni
źródło
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ę.

Emre Yazici
źródło
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">
Sara
źródło
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);
}
Paul Alexander
źródło
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.

Antuan Develle Claude
źródło
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>
Li Che
źródło
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>
Ben
źródło
1

Dodaj:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}
Anas
źródło
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>
andrewoodleyjr
źródło
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.

Husam
źródło
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.

Simon Chius
źródło
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>

Muhaiminur Rahman
źródło
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.

Bbake Waikhom
źródło
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.

DEVSHK
źródło
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">
Md Imran Choudhury
źródło