322

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

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

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

但它不适用于我的设备 (HTC Desire)。它从“纵向”切换到“横向”,忽略清单文件中的行。

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

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

但同样,没有运气。

4

12 回答 12

565

不要将方向应用于应用程序元素,而应将属性应用于活动元素,并且还必须configChanges按如下所述进行设置。

例子:

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

这在清单文件中应用AndroidManifest.xml

于 2011-02-03T11:41:52.287 回答
26

注意

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

被添加到清单文件中 - 定义活动的地方。

于 2013-05-25T14:59:05.233 回答
15

如果你有很多像我一样的活动,在你的应用程序中,或者如果你不想在清单中为每个活动标签输入代码,你可以这样做。

在您的应用程序基类中,您将获得生命周期回调

所以基本上在应用程序类中创建 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) {

            }
        });
}

我希望这有帮助。

于 2015-11-14T07:33:02.537 回答
14

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

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
于 2011-02-03T11:42:35.610 回答
11

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

导入以下行:

import android.content.pm.ActivityInfo;

在上面添加下面的行setContentView(R.layout.activity_main);

对于肖像

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

对于景观

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

这肯定会奏效。

于 2018-05-31T04:14:32.313 回答
4

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

android:configChanges="orientation|screenSize"

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

另外,如果您keyboardHidden的示例中都包含了价值,那么您是否还应该考虑locale, mcc,fontScalekeyboard

于 2014-07-29T10:38:44.480 回答
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">

这为我解决了问题。

于 2014-01-21T10:20:51.063 回答
2

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

android:screenOrientation="portrait"

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

android:configChanges="orientation|keyboardHidden"

也是,它的工作原理。

于 2014-06-24T11:58:49.767 回答
2

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

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你可以在任何地方使用这个变量“orientation” Activity

<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}" />
于 2018-12-12T10:00:14.363 回答
1

我认为您想添加android:configChanges="orientation|keyboardHidden"到您的活动中?否则,活动将在配置更改时重新启动。onConfigurationChanged那时不会被调用,只有onCreate

于 2011-02-03T11:43:51.667 回答
0

要让您的整个应用程序在完整的纵向模式或完整的横向模式下运行,您必须做一件非常简单的事情。

  1. 转到您应用的清单文件夹
  2. 查看定义了意图过滤器的活动。它基本上是您的应用程序启动时打开的第一个活动。
  3. 在此活动中添加android:screenOrientation="portrait"

这将使您的整个应用程序在纵向模式下运行,或者您也可以将其设置为在横向模式下运行。

于 2021-11-05T19:55:10.217 回答
-16

简短的回答:不要这样做。

重新设计您的应用程序,使其可以在纵向和横向模式下运行。没有什么 UI 不能设计为在纵向和横向上都可以使用;只有懒惰或缺乏想象力的开发人员。

原因很简单。您希望您的应用能够在尽可能多的不同设备上被尽可能多的受众使用。通过强制特定的屏幕方向,您会阻止您的应用程序(可用)在不支持该方向的设备上运行,并且您会挫败和疏远喜欢不同方向的潜在客户。

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

我现在正在用一个应用程序来解决这个问题,作为消费者和开发人员,我讨厌它。尽管该应用程序很有用,但它提供的功能也很出色,但我绝对讨厌该应用程序,因为它迫使我使用与我使用设备的所有其他方式相反的方向。

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


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

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

问题真的是“我应该在我的应用程序中锁定屏幕方向吗?” 提问者选择将 UI 设计为仅在纵向模式下才能正常工作和看起来不错。我怀疑这是为了节省开发时间,或者因为应用程序的工作流程特别有利于纵向布局(常见于手机游戏)。但是这些原因忽略了激发正确设计的所有真正重要的因素。

  1. 客户参与 - 您希望您的客户感觉被吸引到您的应用程序中,而不是被赶出应用程序。该应用程序应该从您的客户在打开您的应用程序之前所做的一切顺利过渡。(这就是大多数平台具有一致的设计原则的原因,因此大多数应用程序看起来或多或少相似,尽管它们不必如此。)

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

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

设计不佳的 UI 会降低客户参与度和响应,最终导致收入下降。在以移动为中心的世界中(尤其是纵向/横向显示模式的主题),这解释了为什么响应式网页设计如此重要。Walmart Canada 于 2013 年 11 月在其网站上引入了响应式设计,客户转化率提高了20% 。O'Neill Clothing 实施了响应式网页设计,来自使用 iOS 设备的客户的收入增长了 101.25% ,来自使用 Android 设备的客户的收入增长了 591.42 %

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

锁定屏幕方向是 UI 设计等效于实现一个 do-while 循环。您真的确定要这样做,还是有更好的选择?

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

于 2017-08-14T00:35:24.900 回答