如何在Android上禁用方向更改?

时间:2009-10-02 22:12:44

标签: android android-activity android-orientation

我有一个应用程序,我只想在纵向模式下使用,所以我已经定义了 清单XML中的android:screenOrientation =“portrait”。这适用于HTC Magic手机(并防止其他手机上的方向更改)。

但是当我打开硬件HTC G1(而不是虚拟键盘)时,QWERTY keyboard手机出现问题。我的活动保持纵向模式,但它似乎重新启动并失去所有状态。 HTC Hero版本不会发生这种情况。

我的应用程序非常大,因此我不希望它在键盘打开时重新启动并丢失所有状态。我该如何防止这种情况?

13 个答案:

答案 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中:

  1. 添加:
  2. using Android.Content.PM;到您的活动命名空间列表。

    1. 添加:
    2. [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) {

        }

    })

}

}