首页 文章

强制“纵向”方向模式

提问于
浏览
251

我正在尝试为我的应用程序强制“纵向”模式,因为我的应用程序绝对不是为“横向”模式设计的 .

在阅读了一些论坛之后,我在清单文件中添加了这些行:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

但它不适用于我的设备(HTC Desire) . 它从“portrait”lo“landscape”切换,忽略清单文件中的行 .

在更多论坛阅读之后,我尝试在我的清单文件中添加它:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

这个函数在我的activity类中:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

但同样,没有运气 .

11 回答

  • 3

    不要将方向应用于 application 元素,而应将属性应用于 activity 元素,并且还必须如下所述设置 configChanges .

    例:

    <activity
       android:screenOrientation="portrait"
       android:configChanges="orientation|keyboardHidden">
    </activity>
    

    这将应用于清单文件 AndroidManifest.xml .

  • 20

    注意

    android:screenOrientation="portrait"     
    android:configChanges="orientation|keyboardHidden"
    

    在清单文件中添加 - 定义活动的位置 .

  • -5

    我认为 android:screenOrientation="portrait" 可以用于个人活动 . 所以在 <activity> 标签中使用该属性如:

    <activity android:name=".<Activity Name>"
        android:label="@string/app_name" 
        android:screenOrientation="portrait">
       ...         
    </activity>
    
  • 471

    如果您在我的应用程序中有很多活动,或者如果您不想为清单中的每个活动标记输入代码,则可以执行此操作 .

    在Application Base类中,您将获得生命周期回调

    所以基本上当在应用程序类中创建on create时,每个活动发生的事情都是代码..

    public class MyApplication extends Application{
    
    @Override
        public void onCreate() {
            super.onCreate();  
    
      registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(Activity activity, Bundle bundle) {
                    activity.setRequestedOrientation(
                            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
    
    // for each activity this function is called and so it is set to portrait mode
    
    
                }
    
                @Override
                public void onActivityStarted(Activity activity) {
    
                }
    
                @Override
                public void onActivityResumed(Activity activity) {
    
                }
    
                @Override
                public void onActivityPaused(Activity activity) {
    
                }
    
                @Override
                public void onActivityStopped(Activity activity) {
    
                }
    
                @Override
                public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
    
                }
    
                @Override
                public void onActivityDestroyed(Activity activity) {
    
                }
            });
    }
    

    我希望这有帮助 .

  • 0

    设置 force Portrait or Landscape mode ,分别添加行 .

    Import 以下行:

    import android.content.pm.ActivityInfo;
    

    setContentView(R.layout.activity_main); 上方添加以下行

    对于 Portrait

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait
    

    对于 Landscap

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape
    

    这肯定会奏效 .

  • 1

    我的AndroidManifest.xml中有这一行

    <activity 
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
        android:label="@string/app_name" android:name="Project Name"
        android:theme="@android:style/Theme.Black.NoTitleBar">
    

    我更改为(刚刚添加 android:screenOrientation="portrait"

    <activity 
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
        android:label="@string/app_name" android:name="Project Name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Black.NoTitleBar">
    

    这对我来说是固定的 .

  • 2

    补充一点:我最近更新了一个应用程序,之前在横向和纵向模式下工作,我希望更新版本应该在纵向模式下工作,所以我添加了

    android:screenOrientation="portrait"
    

    到相应的活动,当我测试更新时它刚刚崩溃 . 然后我补充说

    android:configChanges="orientation|keyboardHidden"
    

    它也有效 .

  • 9

    我想你想在你的活动中添加 android:configChanges="orientation|keyboardHidden" ?否则,将在config-change上重新启动活动 . 那时 onConfigurationChanged 不会被调用,只有 onCreate

  • 1

    根据Android的文档,您还应经常包含 screenSize 作为可能的配置更改 .

    android:configChanges="orientation|screenSize"
    

    如果您的应用程序的目标是API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明),那么您还应该声明“screenSize”配置,因为当设备在纵向和横向之间切换时它也会发生变化 .

    另外,如果您在示例中都包含值 keyboardHidden ,那么您是否也应该考虑 localemccfontScalekeyboard 和其他?

  • 5

    如果您希望在 debugrelease 版本中支持不同的方向,请写入(请参阅https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest) .

    app 文件夹的 build.gradle 中写道:

    android {
        ...
        buildTypes {
            debug {
                applicationIdSuffix '.debug'
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                // Creates a placeholder property to use in the manifest.
                manifestPlaceholders = [orientation: "fullSensor"]
            }
            release {
                debuggable true
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                // Creates a placeholder property to use in the manifest.
                manifestPlaceholders = [orientation: "portrait"]
            }
        }
    }
    

    然后在 AndroidManifest 中你可以在任何 Activity 中使用这个变量"orientation":

    <activity
        android:name=".LoginActivity"
        android:screenOrientation="${orientation}" />
    

    您可以添加 android:configChanges

    manifestPlaceholders = [configChanges: "", orientation: "fullSensor"] 在调试中和 manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"] 在发布中,

    <activity
        android:name=".LoginActivity"
        android:configChanges="${configChanges}"
        android:screenOrientation="${orientation}" />
    
  • 10

    简短回答: Don't do it.

    重新设计您的应用程序,使其可以纵向和横向模式运行 . 没有像UI这样的东西不能被设计成在肖像和风景中工作;只有懒惰或缺乏想象力的开发人员 .

    原因很简单 . 您希望您的应用尽可能在尽可能多的设备上尽可能广泛地使用 . 通过强制执行特定的屏幕方向,您可以阻止您的应用程序(不可用)在不支持该方向的设备上运行,并且您会让那些喜欢不同方向的潜在客户感到沮丧和疏远 .

    示例:您将应用程序设计为强制纵向模式 . 客户在二合一设备上下载应用程序,他们主要使用横向模式 .
    结果1:您的应用程序无法使用,或者您的客户被迫移除设备,旋转设备,并以不熟悉或不舒适的方向使用设备 .
    结果2:客户对应用程序的非直观设计感到沮丧,并找到替代方案或完全抛弃应用程序 .

    我现在正在使用应用程序与此作斗争,作为消费者和开发人员,我讨厌它 . 与应用程序一样有用,就像它提供的功能一样棒,我绝对讨厌应用程序,因为它迫使我使用与我使用设备的其他方式相反的方向 .

    您不希望您的客户讨厌您的应用 .


    我知道这并没有直接回答这个问题,所以我想为那些好奇的人详细解释一下 .

    开发人员倾向于非常擅长编写代码并且在设计方面非常糟糕 . 这个问题,虽然听起来像是一个代码问题而且问问者肯定觉得这是一个代码问题,但这确实是一个设计问题 .

    问题确实是“我应该在我的应用程序中锁定屏幕方向吗?”提问者选择设计UI以实现功能,并且仅在纵向模式下看起来很好 . 我怀疑这是为了节省开发时间,还是因为应用程序的工作流程特别有利于纵向布局(通常用于手机游戏) . 但这些原因忽视了促使正确设计的所有重要因素 .

    • 客户参与 - 您希望您的客户感觉被拉入您的应用,而不是被推出 . 在打开您的应用之前,应用应该可以顺利地从您的客户所做的任何事情过渡 . (这就是大多数平台具有一致设计原则的原因,因此大多数应用程序看起来或多或少都相似,尽管他们不需要 . )

    • 客户响应 - 您希望客户对您的应用做出积极反应 . 他们应该喜欢使用它 . 即使它是工作的工资单应用程序,也应该很高兴他们打开它并进入 . 应用程序应该节省您的客户时间并减少对替代品的挫败感 . (惹恼用户的应用程序会对您的应用产生怨恨,这会引起对您品牌的不满 . )

    • 客户转换 - 您希望您的客户能够快速轻松地从浏览转移到交互 . 这是将展示转化为收入的任何应用的最终目标 . (从业务角度来看,不产生收入的应用程序会浪费您的构建时间 . )

    设计糟糕的用户界面会降低客户参与度和响应速度,从而最终降低收入 . 在以移动为中心的世界中(特别是在纵向/横向显示模式的主题上),这解释了为什么响应式网页设计如此重要 . Walmart Canada introduced responsive design on their website in November 2013 and saw a 20% increase in customer conversion. O'Neill Clothing实施了响应式网页设计和revenue from customers using iOS devices increased 101.25%, and 591.42% from customers using Android devices .

    开发人员也倾向于专注于实现特定解决方案(例如锁定显示方向),并且该站点上的大多数开发人员都非常乐意帮助实现该解决方案,而不会质疑这是否是最好的解决问题的方法 .

    锁定屏幕方向是UI设计相当于实现do-while循环 . 你真的确定要这样做,还是有更好的选择?

    不要强制您的应用程序进入单一显示模式 . 投入额外的时间和精力使其具有响应性 .

相关问题