防止Android上的屏幕旋转

Posted

技术标签:

【中文标题】防止Android上的屏幕旋转【英文标题】:Prevent screen rotation on Android 【发布时间】:2011-02-13 10:09:28 【问题描述】:

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

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

【问题讨论】:

***.com/questions/1512045/… 您可以处理屏幕方向更改 AsyncTasks。防止屏幕方向更改只是一种懒惰的解决方法。而且在方向变化时保持 AsyncTask 的活动并不难:) clamernotes.blogspot.com/2011/04/… 实际提供解决方案或一些代码会更有帮助,Romain,而不是仅仅断言“解决方案存在并且不难”。 你可以使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 【参考方案1】:

添加

android:screenOrientation="portrait" 

 android:screenOrientation="landscape" 

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

【讨论】:

请注意,这只是在您的应用程序中隐藏了一个错误,使用户不太可能被它绊倒。但他们仍然会。任何配置更改都可能导致您的活动重新启动。您确实需要正确编写活动以在异步任务重新启动时处理它。 这在一种情况下对我不起作用。在打开应用程序之前,我将屏幕设置为横向。当我打开应用程序时,屏幕旋转为纵向并导致第二次调用 asynctask。 您需要设置“以纵向模式打开”“始终保持纵向模式”。只做1是没有意义的。 @hackbod 无论如何,这是谷歌点击“android 应用程序防止屏幕旋转”的第一名,我的需求与异步任务无关 @hackbod 那么我们如何正确地编写我们的活动来处理这个问题呢?【参考方案2】:

您可以按照以下逻辑来防止自动旋转屏幕您的AsyncTask 正在运行:

    使用getRequestedOrientation() 将您当前的屏幕方向存储在您的活动中。 使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)禁用自动屏幕方向。 运行/执行您的AsyncTask。 在您的AsyncTask 末尾使用setRequestedOrientation(oldOrientation) 恢复您之前的定位状态。

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

【讨论】:

比选择的答案好多了。 好主意 :) 您没有存储当前屏幕方向,您可以使用 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 这看起来不可思议,@emre,谢谢!似乎 “好得令人难以置信!” 请注意关于这个问题的大量讨论:***.com/q/3821423/294884 ... android 专家,这里有什么缺点吗?!再次感谢.. 非常感谢。 废话!!如果设备碰巧以横向模式开始,这不起作用。我勒个去!苏:O @Emre,此代码在某些情况下不起作用。例如。如果用户在 AsyncTask 的开始和结束之间改变了方向。那时你会保存并恢复错误的方向。【参考方案3】:

我发现这样做最简单的方法是把

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

【讨论】:

按预期工作【参考方案4】:

在您的 Manifest 文件中,为每个要锁定屏幕旋转的 Activity 添加:如果您想将其锁定为水平模式:

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

或者如果你想在垂直模式下锁定它:

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

【讨论】:

【参考方案5】:

您可以这样做,而不是进入 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 中。【参考方案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>

【讨论】:

【参考方案7】:

您只需要 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>

【讨论】:

【参考方案8】:

添加:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

AndroidManifest.xml 文件中的用户"portrait" 似乎是一个不错的解决方案。但它会强制某些设备(在横向上效果最好)进入纵向,而不是获得正确的方向。在最新的安卓版本上,你会得到一个错误。所以我的建议最好使用"nosensor"

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

【讨论】:

【参考方案11】:

android:screenOrientation="portrait" 在应用程序标签 上

【讨论】:

目前还不清楚如何处理所写的内容,在哪里写。此外,列表中有类似且更清晰的答案,因此不需要答案。【参考方案12】:

如果您使用的是 Android Developer Tools (ADT) 和 Eclipse 您可以转到您的 AndroidManifest.xml --> Application 选项卡 --> 向下选择您的活动。最后,选择您喜欢的方向。 您可以选择众多选项之一。

【讨论】:

【参考方案13】:

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

android:screenOrientation="portrait"

那么它就不会旋转了。

【讨论】:

【参考方案14】:

你可以试试这个方法

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

【讨论】:

【参考方案15】:

使用 AsyncTaskLoader 来确保您的数据安全,即使活动发生变化,也不要使用 AsyncTask 来构建应用程序,而不是防止屏幕旋转。

【讨论】:

【参考方案16】:

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

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

这对我有用。

【讨论】:

以上是关于防止Android上的屏幕旋转的主要内容,如果未能解决你的问题,请参考以下文章

Android 4.3 上的屏幕旋转对话框

YouTube 视频在 WebView Android 中仅在屏幕旋转时播放音频

如何像 iPhone 照片应用程序那样防止自动旋转?

UnsatisfiedLinkError - 在 Android 中旋转相机图像数据(在 OpenCV 中使用,而不仅仅是在屏幕上显示)

android--屏幕旋转方法总结

可以让屏幕上的元素立即旋转