我有一个应用程序,我只想在纵向模式下使用,所以我已经定义了 清单XML中的android:screenOrientation =“portrait”。这适用于HTC Magic手机(并防止其他手机上的方向更改)。
但是当我打开硬件HTC G1(而不是虚拟键盘)时,QWERTY keyboard手机出现问题。我的活动保持纵向模式,但它似乎重新启动并失去所有状态。 HTC Hero版本不会发生这种情况。
我的应用程序非常大,因此我不希望它在键盘打开时重新启动并丢失所有状态。我该如何防止这种情况?
答案 0 :(得分:309)
2013年4月更新:不要这样做。 2009年我第一次回答这个问题并不是一个好主意,现在真的不是一个好主意。 hackbod看到这个答案的原因是:
Avoid reloading activity with asynctask on orientation change in android
将android:configChanges="keyboardHidden|orientation"
添加到AndroidManifest.xml。这告诉系统您将自己处理哪些配置更改 - 在这种情况下无需执行任何操作。
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
有关详细信息,请参阅开发人员参考configChanges。
但是,您的申请可以随时中断,例如通过电话,所以你真的应该添加代码来保存应用程序暂停时的状态。
更新:从Android 3.2开始,您还需要添加“screenSize”:
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
来自开发者指南 Handling the Configuration Change Yourself
警告:从Android 3.2(API级别13)开始,“屏幕大小” 当设备在纵向和横向之间切换时也会发生变化 取向。因此,如果您希望阻止运行时重新启动 开发API级别13或更高级别时的方向更改(如 由minSdkVersion和targetSdkVersion属性声明),你 除“方向”外,还必须包含“screenSize”值 值。也就是说,你必须申报
android:configChanges="orientation|screenSize"
。但是,如果你的 应用程序目标API级别12或更低,然后您的活动始终 处理此配置更改本身(此配置更改 即使在Android 3.2或Android上运行,也不会重新启动您的活动 更高的设备)。
答案 1 :(得分:94)
您需要将AndroidManifest.xml修改为Intrications(之前的Ashton),并确保活动处理onConfigurationChanged事件,因为您需要处理它。这应该是它的样子:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
答案 2 :(得分:39)
我一直觉得你需要两个
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
答案 3 :(得分:22)
如上所述,将您的活动的android:configChanges
(在清单文件中)设置为keyboardHidden|orientation
,然后:
1)覆盖onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2)将此行添加到您的活动onCreate()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
最好将同一行添加到onConfigurationChanged
,因为您的应用会转为纵向模式,然后又回到横向(它只会发生一次,但很烦人)。
您也可以为活动设置android:screenOrientation="nosensor"
(在清单中)。 但使用这种方式你根本无法处理方向更改。
答案 4 :(得分:20)
使用此..
android:screenOrientation="portrait"
答案 5 :(得分:13)
在您的活动的OnCreate方法中使用以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
现在您的方向将设为纵向,永远不会改变。
答案 6 :(得分:10)
在AndroidManifest.xml文件中,对于要锁定的每个活动,添加最后一个screenOrientation
行:
android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
或 android:screenOrientation =“landscape”。
答案 7 :(得分:8)
在 androidmanifest.xml 文件中:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
或
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
答案 8 :(得分:5)
要通过代码锁定屏幕,您必须使用屏幕的实际旋转(0,90,180,270),您必须知道它的自然位置,在智能手机中,自然位置将是纵向和平板电脑,它将是风景。
以下是代码(锁定和解锁方法),它已经在某些设备(智能手机和平板电脑)中进行了测试,效果很好。
public static void lockScreenOrientation(Activity activity)
{
WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Configuration configuration = activity.getResources().getConfiguration();
int rotation = windowManager.getDefaultDisplay().getRotation();
// Search for the natural position of the device
if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||
configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&
(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))
{
// Natural position is Landscape
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}
}
else
{
// Natural position is Portrait
switch (rotation)
{
case Surface.ROTATION_0:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case Surface.ROTATION_90:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Surface.ROTATION_180:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
break;
case Surface.ROTATION_270:
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
break;
}
}
}
public static void unlockScreenOrientation(Activity activity)
{
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
答案 9 :(得分:2)
在Visual Studio Xamarin中:
using Android.Content.PM;
到您的活动命名空间列表。
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
作为你班级的一个属性,如:
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
答案 10 :(得分:0)
添加
android:configChanges="keyboardHidden|orientation|screenSize"
到您的清单。
答案 11 :(得分:0)
请注意,现在没有一种方法可以正常使用!
在Android Studio 1中,一种简单的方法是添加
android:screenOrientation="nosensor"
。
这有效地锁定了屏幕方向。
答案 12 :(得分:0)
如果您只希望应用程序中的所有活动都使用 PORTRAIT 模式,则可以在应用程序类中简单地使用如下所示的内容。
class YourApplicationName : Application() {
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
}
})
}
}