[英]How do I disable orientation change on Android?
2013 年 4 月更新:不要這樣做。 2009 年我第一次回答這個問題時,這不是一個好主意,現在它確實不是一個好主意。 出於以下原因,請參閱 hackbod 的這個答案:
將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 中:
using Android.Content.PM;
給你的活動命名空間列表。
[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.