簡體   English   中英

強制 Android Activity 始終使用橫向模式

[英]Force an Android activity to always use landscape mode

我在HTC G1上使用 Android VNC查看器。 但出於某種原因,盡管我的 G1 處於縱向模式,但該應用程序始終處於橫向模式。 由於 Android VNC 查看器是開源的,我想知道如何將活動硬編碼為“橫向”。 我想改變它以尊重手機方向。

查看第 9 行的 AndroidManifest.xml( 鏈接):

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

這一行將screenOrientation指定為橫向,但作者進一步使用configChanges="orientation|keyboardHidden"覆蓋任何屏幕方向更改。 這指向 VncCanvasActivity.java 中的重寫函數。

如果您查看 VncCanvasActivity,第 109 行是被覆蓋的函數:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

作者專門發表評論以忽略任何鍵盤或方向更改。


如果你想改變這一點,你可以回到上面顯示的 AndroidManifest.xml 文件,並將該行更改為:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

當用戶旋轉設備時,這應該會改變程序從縱向切換到橫向。

這可能有效,但可能會弄亂 GUI 的外觀,具體取決於布局的創建方式。 你將不得不考慮到這一點。 此外,根據活動的編碼方式,您可能會注意到,當屏幕方向改變時,填充到任何輸入框中的值都會消失。 這也可能需要處理。

您也可以在 Java 代碼中設置相同的數據。

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfo 上的其他值將讓您將其設置回傳感器驅動或鎖定肖像。 就我個人而言,我喜歡按照此問題的另一個答案中的建議將其設置為 Manifest 中的某些內容,然后在需要時使用 Android SDK 中的上述調用進行更改。

在我的OnCreate(Bundle) ,我通常執行以下操作:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

您可以在清單中指定活動的方向。 這里

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

在清單中:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

在您的活動中:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

以下是我用來以橫向模式顯示所有活動的代碼:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>

一個快速而簡單的解決方案是針對 AndroidManifest.xml 文件,為您希望強制為橫向模式的每個活動添加以下內容:

android:screenOrientation="landscape"

這適用於 Xamarin.Android。 在 OnCreate()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

就是這樣!! 等這個修復好久了。

我有一個關於雙重啟動需要(以編程方式)橫向模式的活動的舊 Android 問題: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

現在Android在啟動時制作橫向模式。

Arslan,你為什么要以<activity android:name=".youractivityName" android:screenOrientation="portrait" />方式強制定向,盡管清單中已經有一種方法<activity android:name=".youractivityName" android:screenOrientation="portrait" />

在活動中添加以下幾行

您需要輸入每個活動

景觀用

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

肖像畫

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

這里是 MainActivity 的例子

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

在代碼中這樣做是 IMO 錯誤的,如果您將其放入 onCreate,則更是如此。 在清單中執行此操作,“系統”從應用程序啟動時就知道方向。 這種類型的元或頂級“指導”應該在清單中。 如果您想向自己證明這一點,請在 Activity 的 onCreate 中設置一個中斷。 如果您在代碼中執行此操作,它將被調用兩次:它以縱向模式啟動,然后切換到橫向。 如果您在清單中執行此操作,則不會發生這種情況。

對於Android 4.0 (Ice Cream Sandwich) 及更高版本,除了landscape值之外,我還需要添加這些。

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

按下電源按鈕時,僅使用keyboardHidden|orientation仍會導致內存泄漏和重新創建我的活動。

在像這樣調用 setLayout 方法之前,在 onCreate 方法中使用 ActivityInfo (android.content.pm.ActivityInfo)

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

僅使用
android:screenOrientation="portrait" 工具:ignore="LockedOrientationActivity"

CTRL+F11旋轉屏幕。

暫無
暫無

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

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