代码之家  ›  专栏  ›  技术社区  ›  Vidar Vestnes

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

  •  271
  • Vidar Vestnes  · 技术社区  · 16 年前

    我有一个应用程序,我只想在纵向模式下使用,所以我定义了 manifest xml中的android:screenOrientation=“纵向”。这对 HTC Magic 电话(也可以防止其他电话的方向改变)。

    但是我有个问题 HTC G1 打开硬件时打电话 QWERTY keyboard (不是虚拟键盘)。我的活动保持纵向模式,但它似乎重新启动并失去所有状态。这不是发生在 HTC Hero 版本。

    我的应用程序非常大,所以我不希望它在打开键盘时重新启动并丢失所有状态。我怎么能阻止呢?

    12 回复  |  直到 7 年前
        1
  •  308
  •   Pragati Singh    8 年前

    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开始,您还需要添加“屏幕大小”:

    <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属性声明),您 除“方向”外,还必须包括“屏幕大小”值 价值。也就是说,你必须申报 android:configChanges="orientation|screenSize" . 但是,如果您的 应用程序目标是API级别12或更低,那么您的活动始终 处理此配置更改本身(此配置更改 即使在Android 3.2或 更高的设备)。

        2
  •  94
  •   Community Mohan Dere    9 年前

    您需要将androidmanifest.xml修改为 Intrications (以前是Ashton)提到并确保该活动按您希望的方式处理OnConfigurationChanged事件。它应该是这样的:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    
        3
  •  39
  •   m00sey    15 年前

    我一直觉得你两者都需要

    android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
    
        4
  •  22
  •   Dmitry Zaytsev    13 年前

    如上所述,集合 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" 为您的活动(在清单中)。 但是 用这种方式,你根本无法处理方向的改变。

        5
  •  20
  •   Muhammad Aamir Ali    13 年前

    用这个…

        android:screenOrientation="portrait"
    
        6
  •  13
  •   Numenor    13 年前

    在活动的onCreate方法中,使用以下代码:

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    

    现在,您的方向将设置为“纵向”,并且永远不会更改。

        7
  •  10
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    在androidmanifest.xml文件中,对于要锁定的每个活动,添加最后一个 screenOrientation 行:

    android:label="@string/app_name"
    android:name=".Login"
    android:screenOrientation="portrait" >
    

    android:screenOrientation=“横向” .

        8
  •  8
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    在你 androidmanifest.xml文件 文件:

       <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
    

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
    
        9
  •  5
  •   PoOk    13 年前

    要通过代码锁定屏幕,您必须使用屏幕的实际旋转(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);
    }
    
        10
  •  2
  •   Roy Doron    9 年前

    在Visual Studio Xamarin中:

    1. 添加:

    using Android.Content.PM; 给你的活动名称空间列表。

    1. 添加:

    [Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

    作为类的属性,如下所示:

    [Activity(ScreenOrientation = ScreenOrientation.Portrait)]
    public class MainActivity : Activity
    {...}
    
        11
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    添加

    android:configChanges="keyboardHidden|orientation|screenSize" 
    

    到你的舱单上。

        12
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    请注意,所有方法现在都不起作用!

    Android Studio 1一个简单的方法是添加 android:screenOrientation="nosensor" .

    这有效地锁定了屏幕方向。