Запретить поворот экрана на Android - PullRequest
296 голосов
/ 28 апреля 2010

У меня есть одно из моих действий, которое я хотел бы предотвратить вращением, потому что я запускаю AsyncTask, и поворот экрана заставляет его перезапускаться.

Есть ли способ сказать этому занятию "НЕ ВРАЩАТЬ экран, даже если пользователь трясет своим телефоном, как сумасшедший"?

Ответы [ 14 ]

436 голосов
/ 28 апреля 2010

Добавить

android:screenOrientation="portrait" 

или

 android:screenOrientation="landscape" 

до <activity> элемента / с в манифест, и все готово.

124 голосов
/ 03 февраля 2012

Вы можете следовать приведенной ниже логике, чтобы предотвратить автоповорот экрана , пока ваш AsyncTask работает:

  1. Сохраните текущую ориентацию экрана в своей деятельности, используя getRequestedOrientation().
  2. Отключить автоматическую ориентацию экрана с помощью setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Запуск / выполнение вашего AsyncTask.
  4. В конце вашего AsyncTask восстановить прежний статус ориентации, используя setRequestedOrientation(oldOrientation).

Обратите внимание, что есть несколько способов доступа к Activity (который выполняется в потоке пользовательского интерфейса) свойств внутри AsyncTask. Вы можете реализовать свой AsyncTask как внутренний класс или использовать сообщение Handler, в котором указывается ваш Activiy класс.

26 голосов
/ 23 августа 2013

В вашем файле манифеста для каждого действия, которое вы хотите заблокировать поворотом экрана, добавьте: если вы хотите заблокировать его в горизонтальном режиме:

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

или если вы хотите заблокировать его в вертикальном режиме:

<activity
            ...
            ...
            android:screenOrientation="portrait">
23 голосов
/ 18 июня 2014

Самый простой способ, который я нашел, это поставить

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

в onCreate, сразу после

setContentView(R.layout.activity_main);

так ...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
5 голосов
/ 10 июля 2014

Вместо того, чтобы заходить в AndroidManifest, вы можете просто сделать это:

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);
}

Единственный недостаток в том, что он требует API уровня 18 или выше. Так что в основном это кончик копья.

5 голосов
/ 23 октября 2012

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 голосов
/ 18 июля 2013

Следующий атрибут ACTIVITY в AndroidManifest.xml - это все, что вам нужно:

android:configChanges="orientation"

Итак, полный узел активности будет:

<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 голос
/ 24 июля 2018

Добавьте следующее в ваш AndroidManifest.xml

[app> src> main> AndroidManifest.xml]

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

Пример:

<?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>
1 голос
/ 25 декабря 2014

Добавить:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}
0 голосов
/ 20 февраля 2019

Предотвратить поворот экрана, просто добавьте следующую строку в свои манифесты.

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

Это работает для меня.

...