强制“人像”方向模式

我试图强制我的应用程序的“肖像”模式,因为我的应用程序绝对不是devise为“风景”模式。

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

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

但它不适用于我的设备(HTC Desire)。 它从“portrait”和“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); } 

但是,再次,没有运气。

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

例:

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

这在清单文件AndroidManifest.xml

注意

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

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

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

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

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

在您的Application Base类中,您将获得生命周期callback

所以基本上什么事情发生在每个活动时创build应用程序类中的创build获取触发这里是代码..

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

我希望这有帮助。

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

这对我来说固定的东西。

一些补充:我最近更新了一个应用程序,以前是在横向和纵向模式下工作,我想更新的版本应该在纵向模式下工作,所以我补充

 android:screenOrientation="portrait" 

到相应的活动,它只是当我testing更新时崩溃。 然后我补充说

 android:configChanges="orientation|keyboardHidden" 

也是,它的作品。

我想你想添加android:configChanges="orientation|keyboardHidden"到你的活动? 否则,在configuration更改时重新启动活动。 onConfigurationChanged不会被调用,那么只有onCreate

根据Android的文档,你也应该经常包含screenSize作为可能的configuration改变。

 android:configChanges="orientation|screenSize" 

如果您的应用程序的目标API级别为13或更高(由minSdkVersion和targetSdkVersion属性声明),则还应声明“screenSize”configuration,因为当设备在纵向和横向之间切换时,configuration也会更改。

另外,如果你的例子中都包含keyboardHidden fontScale值,你不应该再考虑localemccfontScalekeyboard和其他吗?

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

重新devise您的应用程序,使其可以在纵向和横向模式下运行。 没有一个UI不能被devise成在肖像和风景中工作, 只有懒惰或缺乏想象力的开发人员。

原因很简单。 您希望您的应用尽可能在尽可能多的不同设备上尽可能广泛地被用户使用。 通过强制特定的屏幕方向,您可以防止您的应用程序在不支持该方向的设备上运行(可用),并使您偏好和疏远偏好不同方向的潜在客户。

示例:您将应用程序devise为强制纵向模式。 客户在主要以横向模式使用的2合1设备上下载应用程序。
结果1:您的应用程序无法使用,或者您的客户被迫取消locking设备,旋转设备,并以不熟悉或不舒服的方向使用设备。
结果2:客户因为您的应用程序的非直观devise而感到沮丧,并find替代scheme或完全摒弃该应用程序。

我现在正在用这个应用程序与消费者和开发者打交道,我讨厌这个问题。 作为应用程序是非常有用的,就像它提供的function一样美妙,我绝对讨厌这个应用程序,因为它迫使我使用一个方向,这个方向与我使用我的设备的其他方式相反。

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


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

开发者倾向于编写代码,而且在devise上非常糟糕。 这个问题虽然听起来像一个代码问题,提问者当然觉得这是一个代码问题,但这真的是一个devise问题。

这个问题真的是“我应该如何devise我的用户界面?” 提问者selectdeviseUIfunction,并且只在肖像模式下看起来很好。 我怀疑这是为了节省开发时间,或者因为应用程序的工作stream程特别有利于肖像布局。 但是这些原因忽略了激励devise的真正重要因素。

  1. 客户互动 – 您希望您的客户感受到拉入您的应用程序,而不是被挤出。 应用程序应该从打开应用程序之前的任何客户的过程中平稳过渡。 (这是大多数平台具有一致的devise原则的原因,所以大多数应用程序看起来或多或less相似,尽pipe他们不需要)。

  2. 客户反应 – 您希望您的客户对您的应用程序做出积极的反应。 他们应该喜欢使用它。 即使它是一个工作工资应用程序,它应该是一个很高兴他们打开和时钟。该应用程序应该节省您的客户的时间,并减less挫折的select。 (应用程序,惹恼用户build立对你的应用程序的怨恨,这成长为对你的品牌的怨恨。)

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

devise不佳的用户界面会降低客户的参与度和响应,最终导致收入下降。 在以移动为中心的世界中(特别是在纵向/横向显示模式方面),这就解释了响应式网页devise为何如此重要。 2013年11月,加拿大沃尔玛在其网站上推出了自适应devise,客户转换增长了20% 。 奥尼尔服装实现了响应式网页devise, 使用iOS设备的客户收入增长了101.25% ,使用Android设备的客户增加了591.42%

不要强制您的应用程序进入单一显示模式。 使其响应,使其漂亮。