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

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

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

【问题讨论】:

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

标签: android rotation screen


【解决方案1】:

添加

android:screenOrientation="portrait" 

 android:screenOrientation="landscape" 

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

【讨论】:

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

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

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

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

【讨论】:

  • 比选择的答案好多了。
  • 好主意 :) 您没有存储当前屏幕方向,您可以使用 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
  • 这看起来不可思议,@emre,谢谢!似乎 “好得令人难以置信!” 请注意关于这个问题的大量讨论:stackoverflow.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" />
                      

                      这对我有用。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-11-25
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2020-12-05
                        • 2013-01-08
                        相关资源
                        最近更新 更多