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

Vid*_*nes 282 android android-orientation android-activity

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

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

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

Int*_*ons 315

2013年4月更新:不要这样做.2009年我第一次回答这个问题并不是一个好主意,现在真的不是一个好主意.由hackbod看到这个答案的原因:

避免在android中的方向更改时使用asynctask重新加载活动

添加android:configChanges="keyboardHidden|orientation"到您的AndroidManifest.xml.这告诉系统您将自己处理哪些配置更改 - 在这种情况下无需执行任何操作.

<activity android:name="MainActivity"
     android:screenOrientation="portrait"
     android:configChanges="keyboardHidden|orientation">
Run Code Online (Sandbox Code Playgroud)

有关 更多详细信息,请参阅开发人员参考configChanges.

但是,您的应用程序可以随时中断,例如通过电话呼叫,因此您应该添加代码以在应用程序暂停时保存应用程序的状态.

更新:从Android 3.2开始,您还需要添加"screenSize":

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">
Run Code Online (Sandbox Code Playgroud)

从开发人员指南处理配置更改自己

注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,"屏幕大小"也会更改.因此,如果要在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而阻止运行时重新启动,则除了"orientation"值之外,还必须包含"screenSize"值.也就是说,你必须申报 android:configChanges="orientation|screenSize".但是,如果您的应用程序的目标是API级别12或更低,那么您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动).

  • 只是添加到此并且非常明确,Android可以随时无情地终止您的应用程序,无论方向更改如何,因此您应该使用onPause()和onSaveInstanceState()来保存状态,无论如何. (35认同)
  • @Lumma不,只有Android 3.2及更新版本需要"screenSize".您定位的API级别是多少?我认为如果你的目标是13级或更高,你只需要添加它.我会更新答案以澄清. (2认同)

ube*_*kel 94

您需要将AndroidManifest.xml修改为Intrications(以前称为Ashton),并确保活动处理onConfigurationChanged事件,因为您需要处理它.它应该是这样的:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)

  • 不是`onConfigurationChanged()`在`onCreate()之前调用`如果是这样在oncreate中设置contentViews之前设置方向是**更好**方法,设置它所属的配置也是**更清晰**所以这个答案仍然很好. (3认同)

m00*_*sey 39

我总是发现你需要两者

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)


Dmi*_*sev 22

如上所述,将android:configChanges您的Activity(在清单文件中)设置为keyboardHidden|orientation然后:

1)覆盖 onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}
Run Code Online (Sandbox Code Playgroud)

2)将此行添加到您的活动中 onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)

这比添加相同的线更好onConfigurationChanged,因为你的应用将转为纵向模式,然后回到横向(它只会发生一次,但它很烦人).

您也可以android:screenOrientation="nosensor"为您的活动设置(在清单中).但是使用这种方式你根本无法处理方向变化.


Muh*_*Ali 20

用这个..

    android:screenOrientation="portrait"
Run Code Online (Sandbox Code Playgroud)


Num*_*nor 13

在您的活动的OnCreate方法中使用以下代码:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Run Code Online (Sandbox Code Playgroud)

现在,您的方向将设置为纵向,永远不会改变.

  • 因此,每次方向配置更改时都不会阻止重新启动活动. (4认同)

Gil*_*len 10

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

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
Run Code Online (Sandbox Code Playgroud)

或者android:screenOrientation ="landscape".


Jor*_*sys 8

在你的androidmanifest.xml文件中:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
Run Code Online (Sandbox Code Playgroud)

要么

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)


PoO*_*oOk 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);
}
Run Code Online (Sandbox Code Playgroud)