我有一个我只想在肖像模式下使用的应用程序,因此我在清单XML中定义了Android:ScreenIrientation =“ Portriation”。这适用于 HTC 魔法 手机(并防止其他手机上的方向变化)。

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

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

有帮助吗?

解决方案

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

忌重装用的AsyncTask活性在机器人取向变化

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

从开发指南处理配置改变自己

  

注意:与Android 3.2(API级13)中, “画面尺寸” 开始   当该装置在纵向和横向之间切换也改变   取向。因此,如果你想防止因运行时重新启动   对于API级别13或更高的发展方向变化时(如   由申报的minSdkVersion和targetSdkVersion属性),你   必须包括另外的“屏幕尺寸”价值的“方向”   值。也就是说,你必须声明   android:configChanges="orientation|screenSize"。但是,如果您   应用程序的目标API级别12或更低,那么你总是活动   处理此配置变化本身(此配置更改   在Android 3.2或运行时,不会重新启动您的活动,甚至   较高的器件)。

其他提示

您需要修改的AndroidManifest.xml为 Intrications (以前阿什顿)提到,确保活动处理onConfigurationChanged事件只要你想它来处理。这是应该的样子:

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

我总觉得你既需要

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

如所述,您的活动的设置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"(在清单)。 但是使用这种方式你是无法处理的方向改变的。

使用此..

    android:screenOrientation="portrait"

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

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

现在您的方向将被设置为纵向和永远不会改变。

在AndroidManifest.xml文件,您要添加锁定最后screenOrientation线的每个活动:

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

机器人:screenOrientation = “风景”

在您的的AndroidManifest.xml 文件:

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

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

要由代码锁定屏幕必须使用在屏幕上(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);
}

在 Visual Studio Xamarin 中:

  1. 添加:

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

  1. 添加:

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

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

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

添加

android:configChanges="keyboardHidden|orientation|screenSize" 

向清单中。

请注意,没有方法,似乎现在的工作!

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

这有效地锁定屏幕方向。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top