【问题标题】:How to set entire application in portrait mode only?如何仅将整个应用程序设置为纵向模式?
【发布时间】:2011-10-08 09:59:33
【问题描述】:

如何设置它以使应用程序仅以纵向模式运行?我希望在应用程序运行时禁用横向模式。如何以编程方式进行?

【问题讨论】:

    标签: android


    【解决方案1】:

    适用于任何 Android 版本

    来自 XML

    您可以为 manifest.xml 文件中的每个活动指定android:screenOrientation="portrait"。您不能在 application 标记上指定此选项。

    来自 Java

    其他选项是以编程方式进行,例如在Activity 基类中:

    @Override
    public void onCreate(Bundle savedInstanceState) {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    

    适用于 Android 4+(API 14+)

    最后一个选项是使用活动生命周期侦听器来执行此操作,该侦听器仅在 Android 4.0 (API 14+) 之后才可用。一切都发生在自定义的 Application 类中:

    @Override
    public void onCreate() {
        super.onCreate();  
        registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
            @Override
            public void onActivityCreated(Activity a, Bundle savedInstanceState) {
                a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        });
    }
    

    ActivityLifecycleAdapter 只是一个你需要创建的帮助类,它将是ActivityLifecycleCallbacks 的一个空实现(所以当你只需要其中一个时,你不必重写该接口的每个方法)。

    【讨论】:

    • 它不工作。当我转动设备时,它变成了横向模式。还有更多代码我正在使用这些 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);进度条的说明。这些说明有什么问题吗?
    • 它正在工作。还有一件事不要在您的编码部分中放置以上两条指令。这意味着它使传感器能够改变屏幕方向。
    • -1:提问者特别要求如何//以编程方式// 以及针对整个应用程序执行此操作(这让我相信他们不想为每个活动单独执行此操作)。
    • @jwir3,我不同意。 “编程”不仅仅是编写代码代码,还包括所有元文件、您使用的资源、解决 IDE 的特性等。这是一个很好的答案,解决了问题 OP 将其标记为正确,因此显然是原始问题的充分答案。
    • 使用 LifeCycleCallbacks 方法时,当您将设备置于(通常情况下)横向模式时,活动启动会出现延迟。我猜这是因为设备在活动之间短暂返回横向模式并且需要时间来处理这个问题。在 manifest 中设置方向没有这个效果。
    【解决方案2】:

    是的,您既可以通过编程方式执行此操作,也可以为您的所有活动创建一个所有活动都扩展的 AbstractActivity。

    public abstract class AbstractActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
    

    这个抽象活动也可以用于全局菜单。

    【讨论】:

    • 注意:我认为ActivityInfo.SCREEN_ORIENTATION_NOSENSOR 应该是更好的答案,因为它旨在使设备保持默认状态,因为某些设备没有纵向。但是,“nosensor”对我不起作用,所以 @arcone 的回答代表我。
    【解决方案3】:

    您可以为整个应用程序执行此操作而无需让您的所有活动都扩展一个公共基类。

    首先要确保在项目中包含Application 子类。在您的应用首次启动时调用的 onCreate() 中,您注册了一个 ActivityLifecycleCallbacks 对象(API 级别 14+)以接收活动生命周期事件的通知。

    这让您有机会在您的应用中的任何活动开始(或停止、或恢复等)时执行您自己的代码。此时您可以在新创建的活动上调用setRequestedOrientation()

    class MyApp extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();  
    
            // register to be informed of activities starting up
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    
                @Override
                public void onActivityCreated(Activity activity, 
                                              Bundle savedInstanceState) {
    
                    // new activity created; force its orientation to portrait
                    activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
                }
    
                ....
    
            });
    
        }
    }
    

    【讨论】:

    • 这是解决问题的唯一答案。一条线来统治他们。
    • *一个班级来统治他们。
    • 永远不要忘记添加清单应用程序 root 。 android:name=".MyApp"
    • 这种方式调用activity的onCreate()两次。
    • 问题是当您水平握住设备并开始新的活动时,它以横向显示,然后旋转为纵向。看起来将整个应用程序锁定为纵向的唯一好方法是在 Manifest 中标记每个活动。
    【解决方案4】:

    您可以在清单文件中设置它..

    android:name=".your launching activity name"
    android:screenOrientation="portrait"
    

    你也可以通过在你的类文件中编写代码来达到同样的目的:

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    

    【讨论】:

    • @naresh 请接受,如果您根据您的需要得到任何解决方案,它也会与您的评级竞争
    • 与其他解决方案相比,这确实是一个简单(有效)的解决方案。它适用于 Kotlin。
    【解决方案5】:

    将 android:screenOrientation="portrait" 添加到 AndroidManifest.xml 中的 Activity。例如:

    <activity android:name=".SomeActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
    

    【讨论】:

    • 他说APPLICATION不是activity。
    【解决方案6】:

    用途:

    android:screenOrientation="portrait" 
    

    只需在您希望仅以纵向模式显示的每个活动的应用程序清单文件中写下这一行。

    【讨论】:

      【解决方案7】:

      将此写入您的清单文件,用于每个活动:

      android:screenOrientation="portrait" 
      

      【讨论】:

        【解决方案8】:
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
        
            //setting screen orientation locked so it will be acting as potrait
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
        }
        

        【讨论】:

          【解决方案9】:

          来自 Android 开发者指南:

          "orientation" 屏幕方向已经改变——用户有 旋转设备。注意:如果您的应用程序针对 API 级别 13 或 更高(由 minSdkVersion 和 targetSdkVersion 声明) 属性),那么您还应该声明“screenSize” 配置,因为它也会在设备之间切换时发生变化 纵向和横向。

          "screenSize" 当前可用的屏幕尺寸已更改。这 表示当前可用大小的变化,相对于 当前的纵横比,所以当用户切换时会改变 风景和肖像。但是,如果您的应用程序以 API 级别为目标 12 或更低,那么你的活动总是处理这个配置 自行更改(此配置更改不会重新启动您的 活动,即使在 Android 3.2 或更高版本的设备上运行时也是如此)。添加 在 API 级别 13 中。

          所以,在AndroidManifest.xml文件中,我们可以放:

          <activity
                      android:name=".activities.role_activity.GeneralViewPagerActivity"
                      android:label="@string/title_activity_general_view_pager"
                      android:screenOrientation="portrait"
                      android:configChanges="orientation|keyboardHidden|screenSize"
                      >
                  </activity> 
          

          【讨论】:

            【解决方案10】:

            在我的 config.xml 中的 &lt;widget&gt; 下添加 &lt;preference name="orientation" value="portrait" /&gt; 对我有用。

            (其他解决方案要么在我的设备上不起作用,要么在构建过程中被覆盖,要么在构建过程中出现弃用错误。)

            【讨论】:

            • 所说的config.xml在哪里?你指的是什么开发平台?
            【解决方案11】:

            在Manifest文件中"portrait"你要使用哪个activity,你必须在Activity标签中写下这些代码

              android:screenOrientation="portrait" 
            

            喜欢这个

                     android:icon="@drawable/icon"
                    android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
                    android:screenOrientation="portrait" >
            

            但如果你想横屏使用这样的代码

            android:screenOrientation="landscape"
            

            【讨论】:

              【解决方案12】:

              如果有人想知道,如何为整个应用程序做到这一点,而不必让所有活动都扩展 Kotlin 中的公共基类, 看下面的例子:

              class InteractiveStoryApplication: Application() {
              override fun onCreate() {
                  super.onCreate()
                  registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
                      override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
                          activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                      }
              
                      override fun onActivityPaused(activity: Activity?) {
                      }
              
                      override fun onActivityResumed(activity: Activity?) {
                      }
              
                      override fun onActivityDestroyed(activity: Activity?) {
                      }
              
                      override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
                      }
              
                      override fun onActivityStarted(activity: Activity?) {
                      }
              
                      override fun onActivityStopped(activity: Activity?) {
                      }
                  })
              }
              }
              

              然后你必须像这样在 AndroidManifest 中添加你的通用基类:

              <application android:allowBackup="true"
              android:name=".InteractiveStoryApplication"
              

              【讨论】:

                【解决方案13】:

                您可以通过两种方式做到这一点。

                1. 在清单文件中添加android:screenOrientation="portrait" 对应的活动
                2. 添加 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); `onCreate() 方法中的活动

                【讨论】:

                  【解决方案14】:

                  类似于 Graham Borland 的回答...但如果您不想要,您似乎不必创建 Application 类...只需在您的项目中创建一个 Base Activity

                  public class BaseActivity extends AppCompatActivity {
                  
                  @Override
                  protected void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.activity_base);
                      setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                  
                  }
                  

                  并在你想使用 Potrait 模式的地方扩展这个类而不是 AppCompatActivity

                  public class your_activity extends BaseActivity {}
                  

                  【讨论】:

                    【解决方案15】:

                    对于 Xamarin 用户:

                    如果您将所有活动扩展到BaseActivity,只需添加:

                    this.RequestedOrientation = ScreenOrientation.Portrait;
                    

                    这将解决问题。如果您希望任何特定活动处于横向状态,请在 OnActivityCreated 中覆盖它。如:

                    this.Activity.RequestedOrientation = ScreenOrientation.Landscape;
                    

                    【讨论】:

                      【解决方案16】:

                      嗯, 我尝试了每个答案,但它在旧版本的android中不起作用。 因此,最终的解决方案是将此代码添加到 setContentView 上方的每个活动中:

                          setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                      

                      【讨论】:

                        【解决方案17】:

                        在 kotlin 中 -->

                        在你的 Extends Application 类中使用它fun onCreate()...

                        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
                                override fun onActivityCreated(p0: Activity, p1: Bundle?) {
                                    p0.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
                                }
                        
                                override fun onActivityStarted(p0: Activity) {
                                }
                        
                                override fun onActivityResumed(p0: Activity) {
                                }
                        
                                override fun onActivityPaused(p0: Activity) {
                                }
                        
                                override fun onActivityStopped(p0: Activity) {
                                }
                        
                                override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
                                }
                        
                                override fun onActivityDestroyed(p0: Activity) {
                                }
                            }
                        
                            )}
                        

                        【讨论】:

                          【解决方案18】:

                          在您的清单中输入:

                          <activity
                              android:screenOrientation="portrait"
                              <!--- Rest of your application information ---!>
                          </activity>
                          

                          【讨论】:

                          • 这并没有添加任何 3 岁的答案还没有说的新内容。你可以考虑删除它。如果您决定编辑您的答案以包含更多信息以区分您的答案与其他人的答案,请@reply to me。
                          • android:screenOrientation="portrait" 不能添加到应用标签,它必须在活动标签内
                          猜你喜欢
                          • 2014-03-23
                          • 2017-03-12
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2023-04-01
                          • 1970-01-01
                          • 2014-10-08
                          • 2015-02-25
                          相关资源
                          最近更新 更多