簡體   English   中英

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

[英]How do I disable orientation change on Android?

我有一個我只想在縱向模式下使用的應用程序,所以我在清單 XML 中定義了 android:screenOrientation="portrait"。 這適用於HTC Magic手機(也可以防止其他手機的方向更改)。

但是當我打開硬件QWERTY 鍵盤(不是虛擬鍵盤)時, HTC G1手機出現問題。 我的活動保持縱向模式,但它似乎重新啟動並失去了所有狀態。 HTC Hero版本不會發生這種情況。

我的應用程序很大,所以我不希望它在鍵盤打開時重新啟動並丟失所有狀態。 我怎樣才能防止這種情況?

2013 年 4 月更新:不要這樣做。 2009 年我第一次回答這個問題時,這不是一個好主意,現在它確實不是一個好主意。 出於以下原因,請參閱 hackbod 的這個答案:

避免在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">

來自開發人員指南自行處理配置更改

注意:從 Android 3.2(API 級別 13)開始,當設備在縱向和橫向之間切換時,“屏幕尺寸”也會發生變化。 因此,如果在為 API 級別 13 或更高級別(如 minSdkVersion 和 targetSdkVersion 屬性所聲明的)開發時要防止由於方向更改而導致運行時重新啟動,則除了“orientation”值之外,還必須包括“screenSize”值。 也就是說,您必須聲明android:configChanges="orientation|screenSize" 但是,如果您的應用程序面向 API 級別 12 或更低級別,則您的 Activity 始終會自行處理此配置更改(此配置更改不會重新啟動您的 Activity,即使在 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"

如上所述,將您的 Activity(在清單文件中)的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添加相同的行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" >

或者android:screenOrientation="landscape"

在您的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"

這有效地鎖定了屏幕方向。

如果您只希望應用程序中的所有活動都使用 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) {

        }

    })

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM