คำตอบ:
ดูที่ 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 ยุ่งเหยิงขึ้นอยู่กับว่ารูปแบบนั้นถูกสร้างขึ้นมาอย่างไร คุณจะต้องบัญชีสำหรับสิ่งนั้น นอกจากนี้ยังขึ้นอยู่กับวิธีการเข้ารหัสกิจกรรมคุณอาจสังเกตเห็นว่าเมื่อมีการเปลี่ยนการวางแนวหน้าจอค่าที่ใส่ลงในกล่องอินพุตใด ๆ จะหายไป สิ่งนี้อาจต้องได้รับการจัดการ
If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
คุณสามารถตั้งค่าข้อมูลเดียวกันในรหัส java ของคุณได้เช่นกัน
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
ค่าอื่น ๆ ใน ActivityInfo จะช่วยให้คุณตั้งค่ากลับเป็นเซ็นเซอร์ขับเคลื่อนหรือแนวตั้งที่ล็อคไว้ ส่วนตัวผมชอบที่จะตั้งค่าเป็น Manifest ตามที่แนะนำในคำตอบอื่นสำหรับคำถามนี้แล้วเปลี่ยนมันในภายหลังโดยใช้การโทรด้านบนใน Android SDK หากมีความจำเป็น
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)
ในตัวฉันOnCreate(Bundle)
ฉันมักทำสิ่งต่อไปนี้:
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
ในรายการ:
<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" />
ทำในรหัสเป็น IMO ผิดและมากยิ่งขึ้นดังนั้นหากคุณใส่ไว้ใน onCreate ทำในรายการและ "ระบบ" รู้ทิศทางจากการเริ่มต้นของแอพ และเมตาดาต้าประเภทนี้หรือ "คำแนะนำ" ระดับสูงสุดควรอยู่ในรายการ หากคุณต้องการพิสูจน์ด้วยตัวคุณเองให้หยุดพักในกิจกรรมของ onCreate หากคุณทำในรหัสมันจะถูกเรียกสองครั้ง: มันจะเริ่มขึ้นในโหมดแนวตั้งจากนั้นจะเปลี่ยนเป็นแนวนอน สิ่งนี้จะไม่เกิดขึ้นหากคุณทำในรายการ
สำหรับAndroid 4.0 (Ice Cream Sandwich) และต่อมาฉันต้องเพิ่มสิ่งเหล่านี้นอกเหนือจากlandscape
ค่า
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
การใช้เพียงอย่างเดียวkeyboardHidden|orientation
ยังคงส่งผลให้เกิดการรั่วไหลของหน่วยความจำและการพักผ่อนหย่อนใจของกิจกรรมของฉันเมื่อกดปุ่มเปิดปิด
orientation|screensize
นั้นไม่เพียงพอในทุกกรณี มันจะหมุนอัตโนมัติกลับเป็นแนวตั้ง
ใช้ ActivityInfo (android.content.pm.ActivityInfo) ในวิธีการ onCreate ของคุณก่อนที่จะเรียกเมธอด setLayout เช่นนี้
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
ใช้เฉพาะ
android: screenOrientation = "portrait" tools: ละเว้น = "LockedOrientationActivity"
คุณต้องเข้าร่วมในทุกกิจกรรม
สำหรับภูมิทัศน์
android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"
สำหรับแนวตั้ง
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"
<?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>
configChanges
คุณสมบัติที่แน่นอน? มันดูเหมือนว่าจะทำงานบนโทรศัพท์ไม่ใช่แป้นพิมพ์ของฉันโดยไม่ได้ ... ในสิ่งที่สถานการณ์จะเปลี่ยนแปลงการวางแนวเป็นแนวตั้งถ้าคุณมีscreenOrientation="landscape"
แต่ละเว้นconfigChanges
?