防止Android上的屏幕旋转


315

我有一个我想阻止旋转的活动,因为我正在启动AsyncTask,并且屏幕旋转使其重新启动。

有没有办法告诉此活动“即使用户疯狂地摇晃手机也不要旋转屏幕”?



11
您可以处理屏幕方向更改 AsyncTasks。防止屏幕方向更改只是一个懒惰的解决方法。在方向变化中保持AsyncTask的存活并不难:)
Romain Guy 2010年


56
实际提供一个解决方案或一些代码Romain而不是仅仅断言“存在一个解决方案并不难”,这将大有帮助。
Peter vdL

2
您可以使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Answers:


467

android:screenOrientation="portrait" 

要么

 android:screenOrientation="landscape" 

<activity>清单中的元素,您就完成了。


95
请注意,这只是在您的应用程序中隐藏了一个错误,使用户不太可能绊倒它。但是他们仍然会。任何配置更改都可能导致您的活动重新启动。当异步任务重新启动时,您确实需要正确编写活动以处理异步任务。
hackbod 2010年

1
在一种情况下,这对我不起作用。打开应用程序之前,我已将屏幕设置为横向。当我打开应用程序时,屏幕旋转到纵向,并导致第二次调用asynctask。
2011年

2
您需要将内容设置为“以纵向模式打开” “始终保持纵向模式”。只做1是没有意义的。
卡罗尔

1
@hackbod无论如何,这是Google在“ Android应用阻止屏幕旋转”中排名第一的数字,我的需要与异步任务无关
chiliNUT 2015年

7
@hackbod然后我们如何正确编写我们的活动来解决此问题?
user41805

127

你可以按照下面的逻辑,以防止自动旋转屏幕,而AsyncTask正在运行:

  1. 使用将您当前的屏幕方向存储在活动中getRequestedOrientation()
  2. 使用禁用自动屏幕方向setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
  3. 运行/执行AsyncTask
  4. AsyncTask还原结束时,您可以使用来恢复以前的方向状态setRequestedOrientation(oldOrientation)

请注意,可以通过多种方法访问Activity(在UI线程上运行)属性AsyncTask。您可以将自己实现AsyncTask为内部类,也可以使用Handler戳戳您的Activiy类的消息。


9
比所选答案好得多。
Matej 2012年

3
好主意:)您没有存储当前的屏幕方向,可以使用ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
优美的2014年

这似乎不可思议,@ emre,谢谢!看来“真是太好了!” 请注意有关该问题的大量讨论:stackoverflow.com/q/3821423/294884 ... android专家,这里有什么缺点吗?再次感谢..非常。
Fattie

3
废话!如果设备恰巧以横向模式开始,则此操作无效。我勒个去!SUX:o
Fattie

@Emre,此代码在某些情况下不起作用。例如,如果用户在AsyncTask的开始和结束之间更改了方向。您将保存并恢复了错误的方向。
Pacerier 2014年

27

在清单文件中,为每个要锁定屏幕旋转的活动添加:如果要以水平模式锁定它:

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

或者如果您想将其锁定在垂直模式下:

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

24

我发现做到这一点的最简单方法是

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

7

无需进入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或更高。所以基本上这是矛的尖端。


这部分正在禁用“主页”和“最近使用的应用程序”按钮,甚至在使用SCREEN_ORIENTATION_FULL_SENSOR释放锁定后也处于禁用状态。在Android 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

您仅需要AndroidManifest.xml中ACTIVITY上的以下属性:

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

加:

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

1

将以下内容添加到您的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>

0

如果您使用的是Android开发人员工具(ADT)和Eclipse ,则可以转到AndroidManifest.xml-> 应用程序选项卡->向下并选择您的活动。最后,选择您的首选方向。您可以选择许多选项之一。


0

您必须在manifest.xml文件中添加以下代码。不应旋转的活动,请在该活动中添加此元素

android:screenOrientation="portrait"

然后它将不会旋转。


0

你可以这样尝试

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

即使活动发生变化,也可以使用AsyncTaskLoader来确保数据安全,而不是使用AsyncTask来构建应用,这比阻止屏幕旋转是一种更好的方法。


0

防止屏幕旋转只需在清单中添加以下行。

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

这对我有用。


0

"portrait"AndroidManifest.xml文件中的用户似乎是一个很好的解决方案。但是,这会迫使某些设备(在横向条件下效果最好)进入纵向状态,而无法获得正确的方向。在最新的Android版本上,您会遇到错误。所以我的建议最好使用"nosensor"

<activity
        ...
        ...
        android:screenOrientation="nosensor">
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.