强制“纵向”方向模式

时间:2011-02-03 11:37:43

标签: android screen orientation landscape portrait

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

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

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

和我的活动类中的这个函数:

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

但是,再一次,没有运气。

11 个答案:

答案 0 :(得分:497)

请勿将方向应用于应用元素,而应将该属性应用于活动元素,并且还必须将configChanges设置为如下所述。

示例:

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

这适用于清单文件AndroidManifest.xml

答案 1 :(得分:22)

请注意

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

添加在清单文件中 - 定义了活动。

答案 2 :(得分:12)

我认为android:screenOrientation="portrait"可用于个别活动。因此,请在<activity>标记中使用该属性,如:

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

答案 3 :(得分:9)

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

在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) {

            }
        });
}

我希望这会有所帮助。

答案 4 :(得分:5)

设置强制纵向或横向模式,分别添加线条。

导入以下行:

import android.content.pm.ActivityInfo;

setContentView(R.layout.activity_main);

上方添加以下行

肖像

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Landscap

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

这肯定会奏效。

答案 5 :(得分:3)

我的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">

这对我来说是固定的。

答案 6 :(得分:3)

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

android:configChanges="orientation|screenSize"
  

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

此外,如果您在示例中都包含了值keyboardHidden,那么您也不应该考虑localemccfontScalekeyboard和他人?..

答案 7 :(得分:2)

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

android:screenOrientation="portrait"

到相应的活动,当我测试更新时它就崩溃了。然后我添加了

android:configChanges="orientation|keyboardHidden"

也是如此。

答案 8 :(得分:1)

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

答案 9 :(得分:1)

如果您希望在debugrelease构建中支持不同的方向,请这样编写(请参见https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest)。

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

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 :(得分:-6)

简短回答:不要这样做。

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

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

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

我现在正在与一个应用程序进行斗争,作为消费者和开发者,我讨厌它。尽管应用程序很有用,但它提供的功能非常棒,我绝对讨厌应用程序,因为它迫使我使用的方向与我使用设备的其他方式相反。

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

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

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

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

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

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

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

  4. 设计糟糕的用户界面会降低客户参与度和响应速度,从而最终降低收入。在以移动为中心的世界中(尤其是在纵向/横向显示模式的主题上),这解释了为什么响应式网页设计如此重要。 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循环。你确实确定你想这样做,还是有更好的选择?

    请勿强制您的应用进入单一显示模式。投入额外的时间和精力使其具有响应性。