力“portrait"定位模式

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

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

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

这个函数在activity类中

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

但是,还是不走运。

264462 次浏览

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

例子:

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

这应用于清单文件AndroidManifest.xml

我认为android:screenOrientation="portrait"可以用于单独的活动。因此,在<activity>标记中使用该属性,如下所示:

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

我认为你想要添加android:configChanges="orientation|keyboardHidden"到你的活动?否则,该活动将在config-change上重新启动。这时将不会调用onConfigurationChanged,只调用onCreate

请注意,

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

添加到清单文件中—其中定义了活动。

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

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

android:configChanges="orientation|keyboardHidden"

也是,而且很管用。

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

android:configChanges="orientation|screenSize"

如果应用程序的目标是API级别13或更高(由 minSdkVersion和targetSdkVersion属性),那么您也应该 声明"screenSize"配置,因为当a

.设备在纵向和横向之间切换

此外,如果你的例子中都包含了keyboardHidden值,那么你不应该考虑localemccfontScalekeyboard和其他值吗?

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

在你的Application Base类中,你会得到一个生命周期回调

基本上,在每个活动中,当在应用程序类中创建时发生的事情是在这里被触发的代码。

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


}
});
}

我希望这能有所帮助。

简单回答:不要这样做。

重新设计你的应用程序,使它可以在纵向和横向模式下运行。没有什么UI不能同时适用于纵向和横向;只有懒惰或缺乏想象力的开发者。

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

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

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

你肯定不希望用户讨厌你的应用。


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

有一种趋势是,开发人员很擅长写代码,但很不擅长设计。这个问题,虽然听起来像一个代码问题,提问者当然觉得这是一个代码问题,但实际上是一个设计问题。

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

  1. 客户参与——你希望你的客户感觉被拉进你的应用,而不是被排挤出去。应用应该从用户在打开应用之前所做的任何事情平稳过渡(这就是为什么大多数平台都有一致的设计原则,所以大多数应用看起来或多或少都是相似的,尽管它们不一定非要如此)。

  2. 客户反应——你希望你的客户对你的应用有积极的反应。他们应该喜欢使用你的应用。即使这是一个用于工作的工资单应用,对他们来说打开它并打卡应该是一种乐趣。该应用程序可以节省客户的时间,减少选择的挫败感。(惹怒用户的应用会让用户对你的应用产生怨恨,进而对你的品牌产生怨恨。)

  3. 客户转换——你希望你的客户能够快速、轻松地从浏览转向互动。这是任何应用的最终目标,将印象转化为收益。(从商业角度来看,不能产生收益的应用是在浪费你的时间。)

设计糟糕的UI会降低用户粘性和反应,最终导致收益下降。在一个以移动为中心的世界里(特别是在肖像/风景显示模式的主题上),这解释了为什么响应式网页设计是如此重要。O'Neill Clothing实现了响应式网页设计和来自iOS设备的客户收入增长101.25%,来自Android设备的客户收入增长591.42%

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

锁定屏幕方向在UI设计中相当于实现了一个do-while循环。你是真的确定你想这样做,还是有更好的选择?

不要强迫你的应用进入单一的显示模式。投入额外的时间和精力让它有响应。

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

进口以下行:

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

这肯定有用。

如果你希望在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}" />

要让整个应用运行在完全竖屏模式或完全横屏模式,你需要做一件非常简单的事情。

  1. 转到应用程序的manifest文件夹
  2. 查看定义了intent-filter的活动。它基本上是应用启动时打开的第一个活动。
  3. 在这个活动中添加android:screenOrientation="portrait"

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