บังคับให้กิจกรรม Android ใช้โหมดแนวนอนเสมอ


144

ฉันกำลังที่ใช้ Android VNCผู้ชมบนของHTC G1 แต่ด้วยเหตุผลบางอย่างแอปพลิเคชั่นนั้นอยู่ในโหมดแนวนอนเสมอแม้จะมี G1 ของฉันอยู่ในโหมดแนวตั้ง เนื่องจากตัวแสดง VNC Android เป็นโอเพ่นซอร์สฉันอยากรู้ว่ามันเป็นไปได้อย่างไรที่โค้ดกิจกรรมจะเป็น 'แนวนอน' ฉันต้องการเปลี่ยนให้เป็นไปตามทิศทางของโทรศัพท์

คำตอบ:


188

ดูที่ AndroidManifest.xml ( ลิงก์ ) ที่บรรทัด 9:

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

บรรทัดนี้ระบุscreenOrientationเป็นภูมิทัศน์ แต่เขียนไปไกลในการเอาชนะการเปลี่ยนแปลงใด ๆ configChanges="orientation|keyboardHidden"วางหน้าจอด้วย นี่ชี้ไปที่ฟังก์ชันที่แทนที่ใน VncCanvasActivity.java

ถ้าคุณดูที่ VncCanvasActivity บรรทัดที่ 109 คือฟังก์ชัน overrided:

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

ผู้เขียนใส่ความคิดเห็นโดยเฉพาะเพื่อละเว้นแป้นพิมพ์หรือการเปลี่ยนแปลงการวางแนว


หากคุณต้องการเปลี่ยนแปลงสิ่งนี้คุณสามารถกลับไปที่ไฟล์ AndroidManifest.xml ที่แสดงด้านบนและเปลี่ยนบรรทัดเป็น:

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

สิ่งนี้ควรเปลี่ยนโปรแกรมให้เปลี่ยนจากแนวตั้งเป็นแนวนอนเมื่อผู้ใช้หมุนอุปกรณ์

สิ่งนี้อาจใช้งานได้ แต่อาจทำให้หน้าตาของ GUI ยุ่งเหยิงขึ้นอยู่กับว่ารูปแบบนั้นถูกสร้างขึ้นมาอย่างไร คุณจะต้องบัญชีสำหรับสิ่งนั้น นอกจากนี้ยังขึ้นอยู่กับวิธีการเข้ารหัสกิจกรรมคุณอาจสังเกตเห็นว่าเมื่อมีการเปลี่ยนการวางแนวหน้าจอค่าที่ใส่ลงในกล่องอินพุตใด ๆ จะหายไป สิ่งนี้อาจต้องได้รับการจัดการ


3
ทำไมต้องมีconfigChangesคุณสมบัติที่แน่นอน? มันดูเหมือนว่าจะทำงานบนโทรศัพท์ไม่ใช่แป้นพิมพ์ของฉันโดยไม่ได้ ... ในสิ่งที่สถานการณ์จะเปลี่ยนแปลงการวางแนวเป็นแนวตั้งถ้าคุณมีscreenOrientation="landscape"แต่ละเว้นconfigChanges?
Timmmm


วิธีการบังคับให้กิจกรรมในตัวเช่นภาพระบบเลือกไลบรารีในแนวนอนเท่านั้นหรือแนวตั้งเท่านั้น
Jacky

118

คุณสามารถตั้งค่าข้อมูลเดียวกันในรหัส java ของคุณได้เช่นกัน

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ค่าอื่น ๆ ใน ActivityInfo จะช่วยให้คุณตั้งค่ากลับเป็นเซ็นเซอร์ขับเคลื่อนหรือแนวตั้งที่ล็อคไว้ ส่วนตัวผมชอบที่จะตั้งค่าเป็น Manifest ตามที่แนะนำในคำตอบอื่นสำหรับคำถามนี้แล้วเปลี่ยนมันในภายหลังโดยใช้การโทรด้านบนใน Android SDK หากมีความจำเป็น


@Yegor ไม่เสมอไป จาก android docs:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya

40

ในตัวฉันOnCreate(Bundle)ฉันมักทำสิ่งต่อไปนี้:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
วิธีการที่ประจักษ์ในคำตอบอื่น ๆ ดูเหมือนจะไม่ทำงาน แต่ @ anwarma ของคุณทำ
Anup

31

คุณสามารถระบุการวางแนวของกิจกรรมในรายการ ดูที่นี่

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

24

ในรายการ:

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

ในกิจกรรมของคุณ:

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

11

ต่อไปนี้เป็นรหัสที่ฉันใช้แสดงกิจกรรมทั้งหมดในโหมดแนวนอน:

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

2
"ปฐมนิเทศ" หากแอปพลิเคชันของคุณกำหนดเป้าหมาย API ระดับ 13 ขึ้นไปคุณควรประกาศ "screenSize"
Mina Fawzy

7

วิธีแก้ปัญหาที่ง่ายและรวดเร็วสำหรับไฟล์ AndroidManifest.xml เพิ่มสิ่งต่อไปนี้สำหรับแต่ละกิจกรรมที่คุณต้องการบังคับให้เข้าสู่โหมดแนวนอน:

android:screenOrientation="landscape"


4

แค่นั้นแหละ!! รอคอยการแก้ไขนี้นาน

ฉันเป็น Android ปัญหาเก่าเกี่ยวกับการเริ่มต้นกิจกรรมที่ต้องใช้โหมดแนวนอน (โดยทางโปรแกรม): setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

ตอนนี้ Android สร้างโหมดแนวนอนเมื่อเริ่มต้น


3

Arslan ทำไมคุณถึงต้องการบังคับให้วางแนวทางในเชิงไวยากรณ์แม้ว่าจะมีวิธีการที่ชัดเจนอยู่แล้วก็ตาม <activity android:name=".youractivityName" android:screenOrientation="portrait" />


ฉันไม่ใช่ผู้ถาม แต่บางทีเขาต้องการบังคับให้เขียนโปรแกรมเพราะเขาต้องการบังคับในเวลาใดเวลาหนึ่ง?
Hamzah Malik

1

ทำในรหัสเป็น IMO ผิดและมากยิ่งขึ้นดังนั้นหากคุณใส่ไว้ใน onCreate ทำในรายการและ "ระบบ" รู้ทิศทางจากการเริ่มต้นของแอพ และเมตาดาต้าประเภทนี้หรือ "คำแนะนำ" ระดับสูงสุดควรอยู่ในรายการ หากคุณต้องการพิสูจน์ด้วยตัวคุณเองให้หยุดพักในกิจกรรมของ onCreate หากคุณทำในรหัสมันจะถูกเรียกสองครั้ง: มันจะเริ่มขึ้นในโหมดแนวตั้งจากนั้นจะเปลี่ยนเป็นแนวนอน สิ่งนี้จะไม่เกิดขึ้นหากคุณทำในรายการ


1
ฉันไม่เห็นด้วย. การทำสิ่งใด ๆ ที่เป็นรหัสเมื่อเทียบกับผ่านรายการจะเป็นวิธีที่ฉันชอบเสมอ ตามหลักการความรับผิดชอบเดี่ยวรายการควรเกี่ยวข้องกับคุณสมบัติระดับแอปพลิเคชันสิทธิ์และการผูก API เท่านั้น จริงๆแล้วฉันไม่เห็นด้วยกับแท็ก <activity> ที่ปรากฏอยู่ในรายการแอปพลิเคชันดังนั้นฉันจึงไม่เคยใส่ไว้ในนั้น (และใช้งานได้ดี) เห็นได้ชัดว่ากิจกรรมที่นำเสนอมีความกังวลเกี่ยวกับการนำเสนอ กิจกรรมของคุณควรเป็นความรับผิดชอบ แต่เพียงผู้เดียวต่อวิธีการนำเสนอและฉันมักจะใส่ตรรกะการนำเสนอทั้งหมดลงในรหัสการดู / กิจกรรม
ComeIn

0

สำหรับAndroid 4.0 (Ice Cream Sandwich) และต่อมาฉันต้องเพิ่มสิ่งเหล่านี้นอกเหนือจากlandscapeค่า

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

การใช้เพียงอย่างเดียวkeyboardHidden|orientationยังคงส่งผลให้เกิดการรั่วไหลของหน่วยความจำและการพักผ่อนหย่อนใจของกิจกรรมของฉันเมื่อกดปุ่มเปิดปิด


เตือนการปฏิบัติที่ไม่ดี! สิ่งนี้ไม่เกี่ยวกับการบังคับให้กิจกรรมในโหมดแนวนอน คุณจำเป็นต้องดำเนินการจัดเก็บและนันทนาการของกิจกรรมของคุณ นั่นคือความรู้พื้นฐานการพัฒนา Android อย่าแก้ปัญหาด้วยการแก้ไขแฮ็กนี้ กิจกรรมสามารถปิดได้โดยระบบหากต้องการหน่วยความจำเพิ่ม
Roel

@Roel เป็นวิธีเดียวที่จะป้องกันไม่ให้กิจกรรมหมุนกลับเป็นแนวตั้งเมื่อคุณหมุนอุปกรณ์ จะป้องกันไม่ให้การกำหนดค่าเหล่านี้ส่งผลกระทบต่อกิจกรรม
Peterdk

ขออภัยสำหรับข้อความที่ไม่พอใจเล็กน้อย แต่ฉันทดสอบและฉันไม่ได้ค่าเหล่านี้ทั้งหมดสำหรับโหมดแนวนอน เมื่อคุณเพิ่มค่าเหล่านี้ทั้งหมดหมายความว่าคุณจัดการกับการเปลี่ยนแปลงด้วยตัวเองใน onConfigurationChanged () แทนที่จะเป็นกิจกรรมที่เพิ่งเริ่มต้นใหม่ (และคุณต้องใช้สิ่งนั้น!) แต่ถ้าคุณบังคับให้ภูมิประเทศทำการหมุนจะไม่เกิดขึ้น
Roel

สวัสดีบางคนอาจไม่จำเป็น แต่การละไว้ทั้งหมดจะทำให้เกิดปัญหาการหมุนที่แปลก ตอนนี้ฉันไม่สามารถทดสอบได้ แต่เมื่อฉันพัฒนาแอพที่จำเป็นต้องอยู่ในแนวนอนตลอดเวลาการใช้เพียงอย่างเดียวorientation|screensizeนั้นไม่เพียงพอในทุกกรณี มันจะหมุนอัตโนมัติกลับเป็นแนวตั้ง
Peterdk

การกำหนดค่าเหล่านี้ยังใช้ในโฆษณา Google Mobile และ SDK โฆษณาอื่น ๆ นั่นคือสิ่งที่ฉันได้รับในเวลานั้น
Peterdk

0

ใช้ ActivityInfo (android.content.pm.ActivityInfo) ในวิธีการ onCreate ของคุณก่อนที่จะเรียกเมธอด setLayout เช่นนี้

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


0

เพิ่มบรรทัดต่อไปนี้ในกิจกรรม

คุณต้องเข้าร่วมในทุกกิจกรรม

สำหรับภูมิทัศน์

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>

-25

กดCTRL+F11เพื่อหมุนหน้าจอ


3
ตอนนี้พวกเขาต้องการที่จะตั้งค่าการวางแนวเริ่มต้นของแอพไม่ใช่วิธีหมุนหน้าจอ
kyle k

CTRL + f12 สำหรับโปรแกรมจำลอง
Lazy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.