Android จะเปิดใช้งานโหมดความเข้ากันได้สำหรับแอปที่ประกาศการจำกัดการวางแนวหรือ การปรับขนาด โหมดความเข้ากันได้ช่วยให้มั่นใจว่าแอปจะทำงานได้อย่างเหมาะสมในอุปกรณ์หน้าจอขนาดใหญ่และโทรศัพท์ฝาพับ แต่จะใช้งานได้ไม่ดีเท่าที่ควร
การลบล้างต่อแอปช่วยให้ผู้ผลิตอุปกรณ์ เจ้าของอุปกรณ์เสมือน1 และผู้ใช้สามารถเปลี่ยนลักษณะการทำงานของแอปเพื่อปรับปรุงเลย์เอาต์ของแอปหรือป้องกันไม่ให้แอปใช้งานไม่ได้ในอุปกรณ์บางรุ่น
Android 16
Android 16 (API ระดับ 36) จะไม่สนใจข้อจำกัดด้านการวางแนวหน้าจอ สัดส่วนการแสดงผล และความสามารถในการปรับขนาดของแอปเพื่อปรับปรุงเลย์เอาต์ของแอปในรูปแบบของอุปกรณ์ที่มีความกว้างที่เล็กที่สุด >= 600dp
การลบล้างต่อแอปต่อไปนี้จะใช้ไม่ได้กับแอปที่กำหนดเป้าหมายเป็น API ระดับ 36
- FORCE_RESIZE_APP
- FORCE_NON_RESIZE_APP
- OVERRIDE_MIN_ASPECT_RATIO
- OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
- OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
- OVERRIDE_MIN_ASPECT_RATIO_LARGE
- OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
- OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
- OVERRIDE_ANY_ORIENTATION
- OVERRIDE_ANY_ORIENTATION_TO_USER
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
- OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
- OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
- OVERRIDE_RESPECT_REQUESTED_ORIENTATION
- OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
เลือกไม่ใช้
แอปของคุณสามารถกำหนดเป้าหมายเป็น API ระดับ 36 แต่เลือกไม่ใช้ลักษณะการทำงานของ Android 16 ได้ ในกรณีนี้ OVERRIDE_ANY_ORIENTATION_TO_USER จะใช้ไม่ได้
ประกาศพร็อพเพอร์ตี้ไฟล์ Manifest
หากต้องการเลือกไม่ใช้ลักษณะการทํางานของ API ระดับ 36 ให้ประกาศPROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
พร็อพเพอร์ตี้ไฟล์ Manifest
หากต้องการเลือกไม่ใช้กิจกรรมที่เฉพาะเจาะจง ให้ตั้งค่าพร็อพเพอร์ตี้ในองค์ประกอบ <activity>
ดังนี้
<activity ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</activity>
หากต้องการเลือกไม่ใช้สำหรับทั้งแอป ให้ตั้งค่าพร็อพเพอร์ตี้ในองค์ประกอบ <application>
ดังนี้
<application ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</application>
อุปกรณ์อ้างอิง
อุปกรณ์ต่อไปนี้อาจต้องมีการลบล้างต่อแอปเนื่องจากการกำหนดค่าที่ผิดปกติ หรือการกำหนดค่าที่แอปไม่รองรับ
- แท็บเล็ต: แท็บเล็ตบางรุ่น เช่น Pixel Tablet
จะอยู่ในแนวนอนโดยค่าเริ่มต้น อุปกรณ์จะอยู่ในแนวนอนตามปกติเมื่อ
Display#getRotation()
แสดงผลSurface.ROTATION_0
หากแอปถือว่าROTATION_0
เป็นแนวตั้ง เลย์เอาต์ของแอปและพรีวิวของกล้องอาจไม่ตรงกับจอแสดงผลของอุปกรณ์ - อุปกรณ์พับได้แนวนอน: อุปกรณ์พับได้บางรุ่น เช่น Pixel Fold จะอยู่ใน แนวตั้งเมื่อพับ แต่จะอยู่ในแนวนอนเมื่อกางออก หากแอปถือว่าการวางแนวที่กางออกเป็นแนวตั้ง การกะพริบ วนซ้ำหรือปัญหาเลย์เอาต์อาจเกิดขึ้นได้
- โทรศัพท์ฝาพับแบบพับได้: โทรศัพท์ฝาพับที่กางออกมักจะอยู่ในแนวนอน แต่เมื่อพับแล้ว โทรศัพท์มักจะมีจอแสดงผลขนาดเล็กใน แนวนอน แอปต้องระบุและรองรับการวางแนวของจอแสดงผลที่แตกต่างกัน
- จอแสดงผลภายนอก: อุปกรณ์บางรุ่นสามารถเริ่มเซสชันการแสดงหน้าต่างบนเดสก์ท็อป ในจอแสดงผลภายนอกที่เชื่อมต่อ แอปต้องค้นหาจอแสดงผลภายนอกเพื่อดู ข้อมูล เช่น ขนาดหน้าจอและความละเอียด มิฉะนั้นแอปอาจ คาดการณ์เกี่ยวกับจอแสดงผลไม่ถูกต้อง ซึ่งอาจส่งผลให้แอปทํางานไม่ถูกต้อง
- จอแสดงผลในรถยนต์: จอแสดงผลในรถยนต์จำนวนมากเป็นแนวนอน แต่ไม่ใช่ทั้งหมด การพัฒนาแอปที่จอดรถสำหรับจอแสดงผลในรถยนต์จะคล้ายกับการพัฒนาสำหรับแท็บเล็ต
ปัญหาด้านความเข้ากันได้ที่พบบ่อย
แอปมักประสบปัญหาด้านความเข้ากันได้เนื่องจากข้อจำกัดด้านการวางแนวของแอป ข้อจำกัดด้านความสามารถในการปรับขนาดและสัดส่วนภาพ การจัดการการวางแนวของ พรีวิวกล้องที่ไม่ถูกต้อง และการใช้ API ในทางที่ผิด
เล็ทเทอร์บ็อกซิง
การแสดงผลแบบจอกว้างจะวางแอปไว้ตรงกลางหน้าจอ หรือในหน้าจอขนาดใหญ่ จะวางไว้ที่ด้านใดด้านหนึ่งเพื่อให้เข้าถึงได้สะดวก แมตต์ (แถบสีทึบหรือวอลเปเปอร์เบลอ) จะเติมพื้นที่แสดงผลที่ไม่ได้ใช้ตามด้านข้างหรือด้านบนและด้านล่างของแอป
การเกิดแถบดำด้านบนและด้านล่างมักเกิดขึ้นในอุปกรณ์หน้าจอขนาดใหญ่ เนื่องจากมิติข้อมูลและ สัดส่วนภาพของจอแสดงผลในอุปกรณ์มักจะแตกต่างจากของโทรศัพท์มาตรฐาน ซึ่งเป็นอุปกรณ์ที่แอปส่วนใหญ่ออกแบบมาให้ใช้งาน
รูปที่ 1 แอปที่จำกัดเฉพาะการวางแนวตั้งจะแสดงเป็นแถบดำด้านข้างบนแท็บเล็ตแนวนอนและอุปกรณ์แบบพับได้
ปัญหา
แอปไม่รองรับการกำหนดค่าการแสดงผลทั้งหมดเนื่องจากแอปมี การวางแนวคงที่ อัตราส่วนคงที่ หรือปรับขนาดไม่ได้
การตั้งค่าการกำหนดค่าที่ควบคุมการวางแนวและความสามารถในการปรับขนาดของแอป ได้แก่ รายการต่อไปนี้
screenOrientation
: ระบุการวางแนวคงที่สำหรับ แอป แอปยังตั้งค่าการวางแนวที่รันไทม์ได้โดยใช้Activity#setRequestedOrientation()
resizeableActivity
: ระบุว่าระบบสามารถ ปรับขนาดแอปให้พอดีกับหน้าต่างที่มีขนาดต่างๆ ได้หรือไม่ ใน Android 11 (API ระดับ 30) และต่ำกว่า จะระบุว่าแอปต่างๆ รองรับโหมดหลายหน้าต่างหรือไม่ ใน Android 12 (API ระดับ 31) ขึ้นไป จะระบุว่าแอป รองรับโหมดหลายหน้าต่างในหน้าจอขนาดเล็ก (คลาสขนาดหน้าต่างแบบกะทัดรัด) หรือไม่ ใน Android 12 ขึ้นไป แอปจะรองรับโหมดหลายหน้าต่างบนหน้าจอขนาดใหญ่ (คลาสขนาดหน้าต่างปานกลางหรือขยาย) โดยไม่คำนึงถึงการตั้งค่านี้maxAspectRatio
: ระบุสัดส่วนภาพสูงสุด ที่แอปรองรับ เฉพาะแอปที่ตั้งค่าresizeableActivity
เป็นfalse
เท่านั้นที่ตั้งค่าmaxAspectRatio
ได้minAspectRatio
: ระบุสัดส่วนภาพขั้นต่ำที่แอป รองรับ เฉพาะแอปที่มีresizeableActivity
ตั้งค่าเป็นfalse
เท่านั้นที่ ตั้งค่าminAspectRatio
ได้
แอปที่จำกัดให้ใช้ได้เฉพาะในแนวตั้งจะใช้ในอุปกรณ์แนวนอนไม่ได้
การเพิ่มประสิทธิภาพ
แอปควรรองรับการแสดงผลในอุปกรณ์ทั้งหมดและโหมดหลายหน้าต่าง การวางแนวและขนาด นําข้อจํากัดด้านการวางแนวและสัดส่วนคงที่ ทั้งหมดออกจากเลย์เอาต์แอปและไฟล์ Manifest ของแอป
แอปพลิเคชันรองรับการวางแนวอุปกรณ์ทั้งหมด
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
หากแอปที่มีการวางแนวหรือสัดส่วนภาพคงที่ทำงานในหน้าต่างที่ แอปไม่รองรับขนาดหรือการวางแนวของหน้าต่างโดยตรง Android จะ ใส่แถบดำด้านข้างแอปเพื่อรักษาความต่อเนื่อง
เริ่มตั้งแต่ Android 12 (API ระดับ 31) และต่อเนื่องไปจนถึง 12L (API ระดับ 32) แพลตฟอร์มจะใช้การเพิ่มประสิทธิภาพที่หลากหลายกับแอปที่แสดงแบบกล่องจดหมาย ผู้ผลิต อุปกรณ์จะใช้การเพิ่มประสิทธิภาพ UI คุณไม่จำเป็นต้องพัฒนาแอปเพิ่มเติมเพื่อรับประโยชน์จากการปรับปรุง
Android 12 (API ระดับ 31) มีการปรับปรุงด้านความสวยงามต่อไปนี้ ซึ่งผู้ผลิตอุปกรณ์สามารถกำหนดค่าได้
- มุมโค้ง: มุมของหน้าต่างแอปดูสวยงามยิ่งขึ้น
- ความโปร่งใสของแถบระบบ: แถบสถานะและแถบนำทางที่ซ้อนทับแอปจะมีความโปร่งใสบางส่วน ทำให้ไอคอนในแถบมองเห็นได้เสมอเมื่ออยู่เหนือพื้นหลังที่มีแถบดำด้านบน-ล่างของภาพ
- สัดส่วนการแสดงผลที่กำหนดค่าได้: ปรับสัดส่วนการแสดงผลของแอปได้ เพื่อปรับปรุงรูปลักษณ์ของแอป
รูปที่ 2 แอปที่มีแถบดำด้านข้างพร้อมการเพิ่มประสิทธิภาพ UI
12L (API ระดับ 32) มีการปรับปรุงฟังก์ชันการทำงานดังต่อไปนี้
การวางตำแหน่งที่กำหนดค่าได้: ในหน้าจอขนาดใหญ่ ผู้ผลิตอุปกรณ์สามารถ วางตำแหน่งแอปไว้ทางด้านซ้ายหรือขวาของจอแสดงผล ซึ่งจะช่วยให้ โต้ตอบได้ง่ายขึ้น
ปุ่มรีสตาร์ทที่ออกแบบใหม่: ผู้ผลิตอุปกรณ์สามารถปรับโฉมปุ่มรีสตาร์ท สำหรับโหมดความเข้ากันได้ของขนาด เพื่อให้ผู้ใช้จดจำได้ดียิ่งขึ้น
Android 13 (API ระดับ 33) เพิ่มกล่องโต้ตอบการให้ความรู้แก่ผู้ใช้เกี่ยวกับการวางตำแหน่งแอปที่มีแถบดำด้านข้างบนหน้าจอหรือการรวมแถบดำด้านข้างในโหมดแยกหน้าจอ
รูปที่ 3 แอปที่มีแถบดำด้านบนและด้านล่างพร้อมกล่องโต้ตอบการให้ความรู้แก่ผู้ใช้
โหมดความเข้ากันได้ของขนาด
โหมดความเข้ากันได้ของขนาดคือการแสดงผลแบบจดหมายที่รักษาสัดส่วนภาพของแอปและ มีการควบคุมการรีสตาร์ท โดยตัวควบคุมนี้ช่วยให้ผู้ใช้รีสตาร์ทแอปและ วาดจอแสดงผลใหม่ได้ Android จะเรียกใช้โหมดความเข้ากันได้ของขนาดสำหรับแอปที่ ปรับขนาดไม่ได้ เมื่อกิจกรรมย้ายไปยังคอนเทนเนอร์จอแสดงผลที่ไม่เข้ากัน กับขนาดของกิจกรรม ระบบอาจปรับขนาดแอปเพื่อเติมเต็มจอแสดงผลของอุปกรณ์ ในมิติข้อมูลอย่างน้อย 1 มิติ
การเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ที่อาจทําให้เกิดโหมดความเข้ากันได้ของขนาดมีดังนี้
- การหมุนอุปกรณ์
- อุปกรณ์ที่พับได้กำลังพับหรือกางออก
- เปลี่ยนระหว่างโหมดการแสดงผลแบบเต็มหน้าจอและแบบแยกหน้าจอ
ปัญหา
โดยปกติแล้ว โหมดความเข้ากันได้ของขนาดจะใช้กับกิจกรรมที่ถูกจำกัดใน การวางแนวหรือสัดส่วนภาพ และได้รับการกำหนดค่า (หรือระบบกำหนด) ให้ ปรับขนาดไม่ได้
ระบบจะถือว่าแอปของคุณปรับขนาดได้และจะไม่วางแอปในโหมดความเข้ากันได้ของขนาด หากแอปมีคุณสมบัติตรงตามเกณฑ์ต่อไปนี้
- ปรับขนาดได้ด้วย
resizeableActivity="true"
- รองรับโหมดการแสดงภาพซ้อนภาพ (PIP)
- ฝังอยู่
- มีการใช้การลบล้างต่อแอปของ
FORCE_RESIZE_APP
โดย ผู้ผลิตอุปกรณ์ (ระบบจะไม่สนใจพร็อพเพอร์ตี้ที่แอปตั้งค่าไว้)
หากแอปไม่เป็นไปตามเงื่อนไขใดๆ ระบบจะถือว่าแอปปรับขนาดไม่ได้และอาจอยู่ในโหมดความเข้ากันได้ของขนาด
แอปแบบปรับขนาดไม่ได้ขัดข้องในโหมดหลายหน้าต่าง
การเพิ่มประสิทธิภาพ
แอปควรรองรับขนาดการแสดงผลทั้งหมด ทำให้แอปปรับขนาดได้โดยการตั้งค่าแอตทริบิวต์
android:resizeableActivity
ขององค์ประกอบ <activity>
หรือ <application>
เป็น true
ใน
ไฟล์ Manifest ของแอป ออกแบบเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์/เลย์เอาต์ที่ปรับตามขนาดหน้าจอสำหรับแอปของคุณ ดูข้อมูลเพิ่มเติมได้ที่รองรับขนาดการแสดงผลต่างๆ และรองรับโหมดหลายหน้าต่าง
แอปทำงานได้ในทุกขนาดหน้าต่าง
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
Android จะนำแอปไปไว้ในโหมดความเข้ากันได้ของขนาดเมื่อระบบพิจารณาว่าการแสดงแอปที่อยู่ในกรอบดำสามารถปรับปรุงได้โดยการปรับขนาดแอปให้เต็มหน้าต่างแสดงผลในมิติข้อมูลอย่างน้อย 1 มิติ ระบบจะแสดงตัวควบคุมการรีสตาร์ท ซึ่งจะสร้างกระบวนการของแอปขึ้นใหม่ สร้างกิจกรรมขึ้นใหม่ และวาด จอแสดงผลใหม่ ดูภาพรวมกระบวนการและเธรดด้วย
แอปแนวตั้งเท่านั้นที่แสดงเป็นแถบดำด้านข้างในแนวนอน โดยตัวควบคุมการรีสตาร์ทจะปรับขนาด
โหมดความเข้ากันได้ของการแสดงผล
โหมดความเข้ากันได้ของการแสดงผลจะป้องกันไม่ให้แอปรีสตาร์ทเมื่อแอปย้าย ระหว่างจอแสดงผลต่างๆ ซึ่งอาจทําให้เกิดการเปลี่ยนแปลงการกําหนดค่า เช่น โหมดสี ความพร้อมใช้งานของหน้าจอสัมผัส หรือ ความหนาแน่นของหน้าจอ
ระบบจะเปิดใช้โหมดความเข้ากันได้ของการแสดงผลสำหรับเกมโดยค่าเริ่มต้น (อิงตามแฟล็ก
android:appCategory
) เพื่อปรับปรุงความเสถียรและความต่อเนื่อง
โหมดความเข้ากันได้ของการแสดงผลจะไม่หยุดการกำหนดค่าของแอปไว้เหมือนกับโหมดความเข้ากันได้ของขนาด แอปจะยังคงรับการอัปเดตการกำหนดค่าทั้งหมดผ่าน
API เช่น Callback onConfigurationChanged()
ได้ แต่จะไม่ต้องรีสตาร์ท
ที่รบกวนการทำงาน ซึ่งหมายความว่าเกมที่รองรับ API อย่างเหมาะสม เช่น
onConfigurationChanged() จะยังคงอัปเดต UI ได้อย่างรวดเร็วแม้ว่าจะอยู่ใน
โหมดความเข้ากันได้ของการแสดงผลก็ตาม
หากต้องการเลือกไม่ใช้โหมดความเข้ากันได้ของการแสดงผลและจัดการการเปลี่ยนแปลงการกำหนดค่าในแอป ให้ประกาศการรองรับการเปลี่ยนแปลงการกำหนดค่าในไฟล์ AndroidManifest.xml
ของแอป และจัดการการเปลี่ยนแปลงการกำหนดค่าในแฮนเดิลการเรียกกลับ onConfigurationChanged()
<activity
android:name=".MyGameActivity"
android:configChanges="colorMode|touchscreen|density|...">
...
</activity>
ลูปกะพริบ
เมื่อแอปไม่รองรับการวางแนวการแสดงผลทั้งหมด แอปอาจขอการวางแนวใหม่ซ้ำๆ เมื่อมีการเปลี่ยนแปลงการกำหนดค่า ซึ่งจะทำให้เกิด ลูปที่ไม่มีที่สิ้นสุดที่ทำให้จอแสดงผลกะพริบหรือแอปหมุนไปเรื่อยๆ
ปัญหา
ใน Android 12 (API ระดับ 31) ขึ้นไป ผู้ผลิตอุปกรณ์สามารถกำหนดค่า
อุปกรณ์ให้ไม่สนใจข้อจำกัดด้านการวางแนวที่แอประบุ และบังคับใช้โหมดความเข้ากันได้แทน
เช่น อุปกรณ์แบบพับได้อาจไม่สนใจการตั้งค่า android:screenOrientation="portrait"
ของกิจกรรมเมื่อกิจกรรมแสดงบนหน้าจอภายในขนาดแท็บเล็ตแนวนอนของอุปกรณ์
หากระบบไม่สนใจข้อจำกัดการวางแนวของแอป แอปจะตั้งค่าการวางแนวได้โดยอัตโนมัติ
โดยการเรียกใช้
Activity#setRequestedOrientation()
การเรียกใช้
จะทริกเกอร์การรีสตาร์ทแอปหากแอปไม่ได้จัดการการเปลี่ยนแปลงการกำหนดค่า (ดูจัดการการเปลี่ยนแปลงการกำหนดค่า)
หลังจาก
รีสตาร์ทแล้ว ระบบจะไม่สนใจข้อจำกัดการวางแนวของแอปอีกครั้ง แอปจะเรียกใช้ setRequestedOrientation()
ซ้ำ
การเรียกใช้จะทริกเกอร์การรีสตาร์ทแอป และ
วนซ้ำไปเรื่อยๆ
อีกกรณีที่คุณอาจพบปัญหานี้คือเมื่อการวางแนวปกติ (การวางแนวปกติตามที่ Android กำหนด) ของหน้าจออุปกรณ์เป็นแนวนอน (กล่าวคือ การเรียก Display#getRotation()
จะแสดงผลเป็น Surface.ROTATION_0
ขณะที่อุปกรณ์มีสัดส่วนภาพเป็นแนวนอน) ในอดีต แอปต่างๆ สันนิษฐานว่า Display.getRotation() =
Surface.ROTATION_0
หมายถึงอุปกรณ์อยู่ในแนวนอน แต่ในบางกรณีก็ไม่เป็นเช่นนั้น เช่น ในหน้าจอด้านในของอุปกรณ์พับได้บางรุ่นและในแท็บเล็ตบางรุ่น
แอปที่อยู่ในแนวนอนบนจอแสดงผลด้านในแบบพับได้อาจตรวจสอบ
การหมุนหน้าจอ รับค่า ROTATION_0
สันนิษฐานว่าการวางแนวตามธรรมชาติ
ของอุปกรณ์เป็นแนวตั้ง และเรียกใช้
setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
เพื่อกำหนดค่าเลย์เอาต์ของแอปใหม่ หลังจากแอปรีสตาร์ท (ในแนวนอน) แอปอาจตรวจสอบการหมุนหน้าจออีกครั้ง รับค่า ROTATION_0
เรียกใช้ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
และวนซ้ำไปเรื่อยๆ
แอปที่ใช้ได้เฉพาะแนวนอนบนจอแสดงผลแนวตั้งจะเรียกใช้ Activity#setRequestedOrientation()
ซ้ำๆ
การเพิ่มประสิทธิภาพ
แอปไม่ควรทำสิ่งต่อไปนี้
- ตั้งค่าการวางแนวเริ่มต้นด้วย
Activity#setRequestedOrientation()
ในเมธอด กิจกรรมonCreate()
เนื่องจากคำขอการวางแนวอาจ ทริกเกอร์โดยไม่คาดคิดจากการเปลี่ยนแปลงการกำหนดค่าที่ไม่ได้จัดการ - สมมติว่าการวางแนวตามธรรมชาติของอุปกรณ์ (
ROTATION_0
) คือแนวตั้ง - กำหนดการวางแนวตามสัญญาณที่ไม่เกี่ยวข้องกับขนาดหน้าต่างปัจจุบัน เช่น
Display#getRotation()
, การมีFoldingFeature
หรือ API ที่เลิกใช้งานแล้ว
แอปจัดการการเปลี่ยนแปลงการกำหนดค่า ไม่มีข้อจำกัดด้านการวางแนว จึงไม่เข้าสู่ลูปการกะพริบ
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
Android จะไม่สนใจการเรียกใช้ Activity#setRequestedOrientation()
ในสถานการณ์ต่อไปนี้
กิจกรรมได้เปิดตัวอีกครั้งจากการเรียกใช้เมธอดก่อนหน้านี้ หรือ มีการเปิดใช้การบังคับหมุนกล้อง (ดูตัวอย่างกล้องด้านล่าง)
ผู้ผลิตอุปกรณ์สามารถใช้ลักษณะการทำงานนี้กับแอปที่มี
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
กิจกรรมดังกล่าวส่งคำขอการวางแนวมากกว่า 2 รายการใน 1 วินาที ซึ่ง แสดงว่าเกิดการวนซ้ำ จากคำขอ 2 รายการในลูป Android จะใช้คำขอที่ขยายพื้นที่แสดงแอปให้มากที่สุด
ผู้ผลิตอุปกรณ์สามารถใช้ลักษณะการทำงานนี้กับแอปที่มี
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
เจ้าของอุปกรณ์เสมือนได้ลบล้างการเรียกเมธอดในอุปกรณ์บางรุ่น
ตัวอย่างจากกล้อง
การแสดงตัวอย่างจากกล้อง (หรือช่องมองภาพ) ของแอปกล้องอาจไม่ตรงกันหรือบิดเบี้ยว ในแท็บเล็ต แล็ปท็อป และจอแสดงผลแบบพับได้
ปัญหา
เอกสารคำจำกัดความความเข้ากันได้ของ Android ระบุว่าเซ็นเซอร์รูปภาพของกล้อง "ต้องวางแนวให้มิติยาวของกล้อง สอดคล้องกับมิติยาวของหน้าจอ"
แอปมักจะถือว่าการวางแนวอุปกรณ์และการวางแนวเซ็นเซอร์กล้องเป็น แนวตั้ง ซึ่งเป็นสมมติฐานที่สมเหตุสมผลในโทรศัพท์มือถือมาตรฐาน แต่การวางแท็บเล็ตและแล็ปท็อปตามปกติ รวมถึงเซ็นเซอร์กล้องอาจเป็นแนวนอน นอกจากนี้ รูปแบบของอุปกรณ์ใหม่ๆ เช่น อุปกรณ์พับได้ อาจมี การวางแนวที่เป็นธรรมชาติหลายแบบและเซ็นเซอร์กล้องหลายตัวที่มีการวางแนวแตกต่างกัน
การเริ่มกิจกรรมโดยวางแนวกล้องในลักษณะที่แอปไม่คาดคิด หรือ การสลับระหว่างกล้องหรือหน้าจออุปกรณ์ต่างๆ (สำหรับอุปกรณ์พับได้) อาจทำให้ พรีวิวของกล้องไม่ตรงแนวหรือบิดเบี้ยว
การแสดงตัวอย่างจากกล้องถ่ายรูปไม่ตรงกันและบิดเบี้ยวในอุปกรณ์พับได้ที่มีหน้าจอขนาดใหญ่
การเพิ่มประสิทธิภาพ
แอปกล้องต้องระบุและจัดการการวางแนวอุปกรณ์และการวางแนวเซ็นเซอร์กล้องอย่างถูกต้องเพื่อแสดงตัวอย่างกล้องที่จัดแนวและปรับขนาดอย่างถูกต้อง แอปต้องคำนวณการหมุนอุปกรณ์ การหมุนเซ็นเซอร์ และสัดส่วนภาพของหน้าจอหรือหน้าต่าง จากนั้นนำผลลัพธ์ไปใช้กับการแสดงตัวอย่างกล้อง ดูคำแนะนำโดยละเอียดได้ที่ตัวอย่างจากกล้องและการแนะนำช่องมองภาพของกล้อง
แสดงตัวอย่างกล้องอย่างถูกต้องและปรับขนาดในทุกการวางแนวของอุปกรณ์
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
อุปกรณ์จะอยู่ในแนวนอนเมื่อ Display#getRotation()
แสดงผลเป็น Surface.ROTATION_0
ระบบจะคำนวณ
CameraCharacteristics.SENSOR_ORIENTATION
จากแนวการวางอุปกรณ์ตามธรรมชาติ Android จะจัดแนวหน้าต่างแนวตั้งของแอปที่จำกัดให้แสดงในแนวตั้งให้สอดคล้องกับการวางแนวตามธรรมชาติของอุปกรณ์ ซึ่งเป็นสิ่งที่แอปส่วนใหญ่คาดหวัง Android จะครอบตัดรูปภาพจากเซ็นเซอร์กล้องด้วยเมื่อ
การวางแนวเซ็นเซอร์เป็นแนวนอนและพรีวิวกล้องเป็นแนวตั้ง วิธีแก้ปัญหาที่เฉพาะเจาะจงมีดังนี้
บังคับหมุนตัวอย่างกล้องสำหรับแอปที่จำกัดเฉพาะแนวตั้ง: แอปที่จำกัดเฉพาะการวางแนวตั้งจะคาดหวังว่าการวางแนวตามธรรมชาติของอุปกรณ์และการวางแนวเซ็นเซอร์กล้องจะเป็นแนวตั้ง อย่างไรก็ตาม ใน Android 12 (API ระดับ 31) ขึ้นไป แอปจะทำงานได้ในหลายการวางแนวอุปกรณ์หาก ผู้ผลิตอุปกรณ์ไม่สนใจข้อกำหนดการวางแนว
เมื่อเชื่อมต่อแอปที่จำกัดเฉพาะแนวตั้งกับกล้อง Android จะบังคับ หมุนแอปเพื่อจัดแนวหน้าต่างแนวตั้งของแอปให้สอดคล้องกับ การวางแนวตามธรรมชาติของอุปกรณ์
ในแท็บเล็ตบางรุ่น (ดูอุปกรณ์อ้างอิง) ระบบจะหมุนหน้าต่างแนวตั้งของแอปเป็นแนวตั้งแบบเต็มหน้าจอเพื่อให้สอดคล้องกับ การวางแนวตามธรรมชาติของอุปกรณ์ แอปจะแสดงเต็มหน้าจอหลังจากหมุน โดยบังคับ
แท็บเล็ต - บังคับการหมุนแอปที่จำกัดเฉพาะแนวตั้ง
ในหน้าจอภายในแนวนอนของอุปกรณ์พับได้ (ดูอุปกรณ์อ้างอิง) ระบบจะหมุนกิจกรรมที่ใช้ได้เฉพาะแนวตั้งเป็นแนวนอนเพื่อให้สอดคล้องกับแนวการวางตามธรรมชาติเมื่อกางออก แอปจะ มีแถบดำด้านข้างหลังจากหมุนโดยบังคับ
อุปกรณ์พับได้ - บังคับให้แอปที่จำกัดเฉพาะแนวตั้งหมุน นอกจากนี้ แอปยังแสดงเป็นแถบดำด้านข้างด้วย
การครอบตัดกล้องหน้าด้านใน: เซ็นเซอร์กล้องหน้าด้านในของโทรศัพท์แบบพับได้บางรุ่นจะอยู่ในแนวนอน นอกจากจะบังคับหมุน ตัวอย่างกล้องบนจอแสดงผลด้านในแบบพับได้แล้ว Android ยังครอบตัดขอบเขตการมองเห็นของกล้องหน้าด้านใน (แนวนอน) เพื่อให้เซ็นเซอร์จับภาพมุมมองตรงข้าม กับการวางแนวของอุปกรณ์
บังคับรีเฟรชตัวอย่างกล้อง: ระบบจะหมุนเวียนผ่านวิธีการตรวจหากิจกรรม
onStop()
และonStart()
(ค่าเริ่มต้น) หรือonPause()
และonResume()
(ใช้โดยOVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE การลบล้างต่อแอป) หลังจากหมุนเวียนเพื่อตรวจสอบว่าตัวอย่างกล้องแสดงอย่างถูกต้องการปรับขนาดสัดส่วนภาพ: ระบบจะเปลี่ยนสัดส่วนภาพของ ตัวอย่างกล้องที่หมุนโดยบังคับแบบไดนามิกเป็นสัดส่วนภาพขั้นต่ำที่สูงขึ้น ซึ่ง ช่วยให้มั่นใจว่าตัวอย่างกล้องจะได้รับการปรับขนาดอย่างเหมาะสม
นักพัฒนาแอปสามารถลบล้างวิธีแก้ปัญหาเหล่านี้ได้หากแอปจัดการตัวอย่างกล้องอย่างถูกต้อง ดูการลบล้างต่อแอป
API ที่มักถูกนำไปใช้ในทางที่ผิด
เนื่องจาก Android ได้เพิ่มการรองรับฟีเจอร์ต่างๆ เช่น โหมดหลายหน้าต่างและ อุปกรณ์ต่างๆ เช่น อุปกรณ์พับได้ เราจึงเลิกใช้งาน API เดิมและแทนที่ด้วย API ที่อัปเดตล่าสุดซึ่งใช้ได้กับขนาดการแสดงผลและรูปแบบอุปกรณ์ทั้งหมด อย่างไรก็ตาม API ที่เลิกใช้งานแล้วจะยังคงใช้งานได้เพื่อความเข้ากันได้แบบย้อนหลัง
View
API บางรายการออกแบบมาเพื่อวัตถุประสงค์พิเศษที่นักพัฒนาแอปอาจไม่เข้าใจดีนัก
ปัญหา
นักพัฒนาแอปยังคงใช้ Display
API ที่เลิกใช้งานแล้วและเข้าใจผิดว่า
API จะแสดงขอบเขตของแอปแทนขอบเขตพื้นที่แสดงผลของอุปกรณ์ หรือนักพัฒนาแอป
ใช้ API ของมุมมองแบบพิเศษเพื่อรับเมตริกการแสดงผลทั่วไปโดยไม่ตั้งใจ
ซึ่งจะส่งผลให้เกิดการคำนวณผิดเมื่อจัดตำแหน่งองค์ประกอบ UI ใหม่หลังจากเหตุการณ์การปรับขนาดหน้าต่างแอป
ทำให้เกิดปัญหาเกี่ยวกับเลย์เอาต์
API Display ที่เลิกใช้งานแล้วและมีการใช้ในทางที่ผิดโดยทั่วไป
ดูข้อมูลเพิ่มเติมได้ที่ รองรับโหมดหลายหน้าต่าง
API การดูที่ถูกนำไปใช้ในทางที่ผิด:
API ที่เลิกใช้งานแล้วคำนวณขอบเขตของแอปไม่ถูกต้อง เนื้อหาแอปอยู่นอกหน้าจอ
การเพิ่มประสิทธิภาพ
อย่าวางตำแหน่งองค์ประกอบ UI โดยอิงตามขนาดการแสดงผลจริง ย้ายข้อมูลแอปไปยัง API ที่อิงตาม WindowMetrics
ซึ่งรวมถึง API ต่อไปนี้
WindowManager
แพลตฟอร์ม:
Jetpack:
API คำนวณเมตริกหน้าต่างแอปได้อย่างถูกต้อง
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
การลบล้าง 2 รายการจะปรับ Display
API ที่เลิกใช้งานแล้วและ View
API ที่ใช้ในทางที่ผิดเพื่อ
แสดงขอบเขตของแอป
ALWAYS_SANDBOX_DISPLAY_APIS
สำหรับ Display
API และ OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
สำหรับ View
API ALWAYS_SANDBOX_DISPLAY_APIS
จะมีผลโดยค่าเริ่มต้นกับ
แอปที่มีสิทธิ์ใช้โหมดความเข้ากันได้ของขนาดด้วย
กิจกรรมที่โปร่งใส
กิจกรรมโปร่งใสเป็นผลมาจากรูปแบบพื้นหลังโปร่งใส เช่น
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
ธีมที่เกี่ยวข้องกับกล่องโต้ตอบ เช่น Theme.MaterialComponents.Dialog
สามารถ
มีสไตล์ที่ทำให้กิจกรรมโปร่งใสได้
กิจกรรมโปร่งใสไม่ครอบคลุมพื้นที่โฆษณา Display ที่มีทั้งหมด ซึ่งทําให้จัดการได้ยากเนื่องจากพื้นที่โฆษณา Display ที่มีอาจเปลี่ยนแปลงได้ตามการเปลี่ยนแปลงการกําหนดค่า เช่น การหมุนอุปกรณ์ การพับและกางอุปกรณ์ และโหมดหลายหน้าต่าง
ปัญหา
กิจกรรมโปร่งใสควรเป็นไปตามขอบเขตของกิจกรรมทึบแสงแรก ด้านล่างกิจกรรมโปร่งใสในสแต็กกิจกรรมของงาน อย่างไรก็ตาม กิจกรรมที่ทึบแสงซึ่งเปิดกล่องโต้ตอบสิทธิ์อาจเป็นแทรมโพลีน (กิจกรรมที่เปิดกิจกรรมอื่นแล้วหายไป) และระบบจึงไม่สามารถกำหนดขอบเขตของกิจกรรมแทรมโพลีนที่เปิดกิจกรรมกล่องโต้ตอบสิทธิ์แบบโปร่งใสได้
วางตำแหน่งกล่องโต้ตอบไม่ถูกต้องเนื่องจากเปิดกิจกรรมจากแทรมโพลีน
การเพิ่มประสิทธิภาพ
กิจกรรมโปร่งใสจะรับช่วงข้อจำกัดจากกิจกรรมทึบแสงที่อยู่บนสุด ซึ่งอยู่ใต้กิจกรรมดังกล่าวในสแต็กกิจกรรมของงาน กิจกรรมที่ไม่โปร่งใสต้องพร้อมใช้งานตลอดวงจรของกิจกรรมที่โปร่งใส ตั้งแต่การสร้างกิจกรรมไปจนถึงการทำลาย ด้วยเหตุนี้ จึงไม่ควรเปิดคำขอสิทธิ์จากกิจกรรม Trampoline
หากกิจกรรมแทรมโพลีนเปิดคำขอสิทธิ์ ผู้ใช้อาจไม่เห็นกล่องโต้ตอบสิทธิ์เนื่องจากกิจกรรมแทรมโพลีนจะถูกทำลายก่อนที่ผู้ใช้จะมีโอกาสตอบกลับกล่องโต้ตอบ และระบบอาจคำนวณขนาดและตำแหน่งของกิจกรรมกล่องโต้ตอบไม่ถูกต้อง
แอปควรเปิดคำขอสิทธิ์จากกิจกรรมที่ยังคง มองเห็นได้จนกว่าผู้ใช้จะตัดสินใจเกี่ยวกับสิทธิ์
มุมมน
กิจกรรมอาจโปร่งใสเนื่องจากรูปแบบที่ระบุความโปร่งใสของพื้นหลัง หรือเนื่องจากเนื้อหาของกิจกรรมไม่เติมพื้นที่แสดงผลที่มีอยู่ หากกิจกรรมโปร่งใสเติมเต็มพื้นที่แสดงผลที่มีอยู่ ระบบจะใช้มุมโค้งกับกิจกรรมโดยอัตโนมัติเมื่อผู้ผลิตอุปกรณ์กำหนดค่าให้ทำเช่นนั้น แต่หากกิจกรรมโปร่งใส (เช่น กล่องโต้ตอบสิทธิ์) ไม่เติมพื้นที่ว่างที่มีอยู่ คุณจะต้องเป็นผู้กำหนดว่าจะใช้มุมโค้งหรือไม่
กล่องโต้ตอบสิทธิ์จะไม่เติมพื้นที่แสดงผลที่ใช้ได้เนื่องจากเลย์เอาต์ของกล่องโต้ตอบ มักใช้ LayoutParams.WRAP_CONTENT แทน LayoutParams.MATCH_PARENT
กล่องโต้ตอบที่มีมุมโค้งวางอย่างถูกต้องเหนือกิจกรรมการเปิดตัวที่มองเห็นได้
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
แสดงกิจกรรมที่เปิดใช้กิจกรรมกล่องโต้ตอบจนกว่าผู้ใช้จะตอบกลับกล่องโต้ตอบ
ระบบจะตรวจสอบว่ากิจกรรมโปร่งใสสืบทอดข้อจำกัดทั้งหมดจาก กิจกรรมทึบแสงแรกที่อยู่ใต้กิจกรรมโปร่งใสในสแต็กกิจกรรม ซึ่งรวมถึงข้อจำกัดที่เกี่ยวข้องกับสิ่งต่อไปนี้
- โหมดความเข้ากันได้ของขนาด
- การวางแนว
- สัดส่วนภาพ
เกม Unity
เกม Unity จะทำงานบน Android แบบเต็มหน้าจอหรือในโหมดหลายหน้าต่าง อย่างไรก็ตาม เกม Unity จำนวนมากจะสูญเสียโฟกัสและหยุดวาดเนื้อหาเมื่อแอปอยู่ใน โหมดหลายหน้าต่าง
ปัญหา
Unity ได้เพิ่มตัวเลือก Resizable Window
ใน Unity 2019.4 เพื่อรองรับโหมดหลายหน้าต่างใน Android อย่างไรก็ตาม
การติดตั้งใช้งานครั้งแรกไม่ได้ตอบสนองต่อวงจรของกิจกรรมใน
โหมดหลายหน้าต่างอย่างถูกต้อง ซึ่งทำให้
UnityPlayer ระงับการเล่นเมื่อแอปสูญเสียโฟกัส เพลเยอร์แสดง
หน้าจอสีดำหรือเฟรมสุดท้ายของเกมที่หยุดนิ่ง การเล่นเกมจะกลับมาทำงานต่อเมื่อ
ผู้ใช้แตะหน้าจอเท่านั้น แอปจำนวนมากที่ใช้เอนจิน Unity ประสบปัญหานี้และ
แสดงเป็นหน้าต่างสีดำในโหมดหลายหน้าต่าง
เกมสูญเสียโฟกัสในโหมดหลายหน้าต่างและแสดงเป็นหน้าต่างสีดำ
การเพิ่มประสิทธิภาพ
อัปเกรด Unity เป็น 2019.4.40 ขึ้นไป แล้วส่งออกเกมอีกครั้ง โปรดเลือกตัวเลือก
Resizable Window
ใน
การตั้งค่าโปรแกรมเล่น Android มิฉะนั้น
เกมจะหยุดชั่วคราวเมื่อไม่ได้โฟกัส แม้ว่าเกมจะมองเห็นได้ทั้งหมดใน
โหมดหลายหน้าต่าง
เกมแสดงเนื้อหาอย่างถูกต้องในโหมดหลายหน้าต่างแม้จะไม่ได้โฟกัสอยู่ก็ตาม
วิธีแก้ปัญหาชั่วคราวเกี่ยวกับความเข้ากันได้
ผู้ผลิตอุปกรณ์สามารถใช้การลบล้างต่อแอป
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
เพื่อส่งเหตุการณ์โฟกัสปลอมไปยังแอปใน
โหมดหลายหน้าต่าง การลบล้างจะช่วยให้กิจกรรมวาดเนื้อหาใหม่และ
ไม่ถูกปิดกั้น
หน้าต่างเดสก์ท็อป
เมื่อแอปทำงานในสภาพแวดล้อมการแสดงหน้าต่างบนเดสก์ท็อป แอปอาจพบ โหมดความเข้ากันได้เพิ่มเติม
แอปที่มีการวางแนวที่ล็อกจะปรับขนาดได้อย่างอิสระ แม้ว่ากิจกรรมจะล็อกเป็นการวางแนวตั้ง แต่ผู้ใช้ยังคงปรับขนาดแอปเป็นการวางแนวนอนได้
แอปที่มีการวางแนวที่ล็อกจะยังคงปรับขนาดได้อย่างอิสระ
อย่างไรก็ตาม หากประกาศกิจกรรมเป็นแบบปรับขนาดไม่ได้ (resizeableActivity = false) UI ของกิจกรรมจะปรับขนาดในขณะที่ยังคง สัดส่วนภาพเดิม
กิจกรรมที่ประกาศว่าปรับขนาดไม่ได้จะมี UI ที่ปรับขนาดแล้ว
การแสดงตัวอย่างจากกล้องในหน้าต่างเดสก์ท็อป
เมื่อแอปในระบบหน้าต่างบนเดสก์ท็อปเริ่มแสดงตัวอย่างกล้อง ช่องมองภาพจะมี UI ที่ปรับขนาดในขณะที่ยังคงอัตราส่วนเดิมไว้ ส่วนที่เหลือของหน้าต่างแอปสามารถ ปรับขนาดได้อย่างอิสระ
การปรับขนาดหน้าต่างที่มีช่องมองภาพของกล้อง
ทดสอบแอปเพื่อหาปัญหาความเข้ากันได้
หากต้องการทดสอบแอปและทำความเข้าใจลักษณะการทำงานของแอปในอุปกรณ์รูปแบบต่างๆ ให้ใช้ประโยชน์จากแหล่งข้อมูลต่อไปนี้
- การสตรีมอุปกรณ์: หากต้องการทดสอบแอปในอุปกรณ์ที่ใช้จริง (รวมถึงอุปกรณ์อ้างอิง) ที่โฮสต์ในศูนย์ข้อมูลของ Google โปรดดูการสตรีมอุปกรณ์ Android ที่ขับเคลื่อนโดย Firebase
- โปรแกรมจำลองใน Android Studio: ดูข้อมูลเกี่ยวกับการสร้าง โปรแกรมจำลองสำหรับอุปกรณ์อ้างอิงได้ที่ สร้างและจัดการอุปกรณ์เสมือน
- โปรแกรมจำลองที่ปรับขนาดได้ของ Android Studio: ดูข้อมูลเกี่ยวกับการเข้าถึงอุปกรณ์เสมือนได้ที่เรียกใช้แอปในโปรแกรมจำลอง Android
มีแถบดำด้านบน-ล่างของภาพ
ตรวจสอบว่าแต่ละกิจกรรมใช้พื้นที่แสดงผลทั้งหมดที่แอปมีได้ ก่อนอื่น ให้ประกาศโค้ดต่อไปนี้ในโฟลเดอร์ทดสอบ
Kotlin
fun isLetterboxed(activity: AppCompatActivity): Boolean { if (isInMultiWindowMode) return false val wmc = WindowMetricsCalculator.getOrCreate() val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds val isScreenPortrait = maxBounds.height() > maxBounds.width() return if (isScreenPortrait) { currentBounds.height() < maxBounds.height() } else { currentBounds.width() < maxBounds.width() } }
Java
public boolean isLetterboxed(AppCompatActivity activity) { if (activity.isInMultiWindowMode()) { return false; } WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate(); Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds(); Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds(); boolean isScreenPortrait = maxBounds.height() > maxBounds.width(); return (isScreenPortrait) ? currentBounds.height() < maxBounds.height() : currentBounds.width() < maxBounds.width(); }
จากนั้นเรียกใช้การทดสอบเพื่อยืนยันลักษณะการทำงานและตรวจสอบว่ากิจกรรมเป้าหมายไม่ได้ อยู่ในกรอบจดหมาย
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertFalse(it.isLetterboxed()) } }
Java
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); @Test public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity( activity -> { assertFalse(activity.isLetterboxed()); }); } }
โดยหลักการแล้ว ให้เรียกใช้การทดสอบประเภทนี้จนกว่าจะผ่านและยืนยันว่ากิจกรรมของแอปใช้พื้นที่แสดงผลทั้งหมดที่แอปใช้ได้ ทดสอบแอปในอุปกรณ์ทุกประเภทเพื่อให้มั่นใจว่าแอปทำงานสอดคล้องกัน
การลบล้างต่อแอป
Android มีการลบล้างที่จะเปลี่ยนลักษณะการทำงานที่กำหนดค่าไว้ของแอป ตัวอย่างเช่น การลบล้าง FORCE_RESIZE_APP
จะสั่งให้ระบบข้ามโหมดความเข้ากันได้ของขนาดและปรับขนาดแอปให้พอดีกับขนาดการแสดงผล แม้ว่าจะมีการระบุ resizeableActivity="false"
ไว้ในไฟล์ Manifest ของแอปก็ตาม
ผู้ผลิตอุปกรณ์จะใช้การลบล้างกับแอปบางแอปหรือทุกแอปในอุปกรณ์หน้าจอขนาดใหญ่บางรุ่น ใน Android 14 (API ระดับ 34) ขึ้นไป ผู้ใช้ สามารถใช้การลบล้างกับแอปผ่านการตั้งค่าอุปกรณ์ได้ ใน Android 16 (API ระดับ 36) ขึ้นไป เจ้าของอุปกรณ์เสมือนจะใช้การลบล้างในอุปกรณ์บางเครื่องที่เจ้าของอุปกรณ์เสมือนจัดการ
การลบล้างต่อแอปของผู้ใช้
ใน Android 14 ขึ้นไป เมนูการตั้งค่าจะช่วยให้ผู้ใช้เปลี่ยนสัดส่วน ภาพของแอปได้ อุปกรณ์ที่มีหน้าจอขนาดใหญ่ เช่น อุปกรณ์อ้างอิง จะใช้เมนูนี้
เมนูจะมีรายการแอปทั้งหมดที่ติดตั้งในอุปกรณ์ ผู้ใช้เลือกแอป แล้วตั้งค่าสัดส่วนภาพของแอปเป็น 3:4, 1:1, เต็มหน้าจอ หรือค่าอื่นๆ ที่กำหนดค่าโดยผู้ผลิตอุปกรณ์ ผู้ใช้ยังรีเซ็ตสัดส่วนภาพเป็นค่าเริ่มต้นของแอปได้ด้วย ซึ่งระบุไว้ในไฟล์ Manifest ของแอป
แอปสามารถเลือกไม่ใช้การลบล้างความเข้ากันได้โดยการตั้งค่าแท็ก PackageManager.Property
ต่อไปนี้
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
หากต้องการเลือกไม่ใช้การลบล้างความเข้ากันได้ของสัดส่วนภาพของผู้ใช้ ให้เพิ่มพร็อพเพอร์ตี้ ลงในไฟล์ Manifest ของแอปและตั้งค่าเป็น
false
<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
ระบบจะยกเว้นแอปของคุณจากรายการแอปในการตั้งค่าอุปกรณ์ ผู้ใช้ จะลบล้างสัดส่วนภาพของแอปไม่ได้
การตั้งค่าพร็อพเพอร์ตี้เป็น
true
จะไม่มีผลPROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
หากต้องการเลือกไม่ใช้ตัวเลือกเต็มหน้าจอของการลบล้างความเข้ากันได้ของสัดส่วนภาพของผู้ใช้ ให้เพิ่มพร็อพเพอร์ตี้ลงในไฟล์ Manifest ของแอปและตั้งค่าเป็น
false
<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
ระบบจะนำตัวเลือกแบบเต็มหน้าจอออกจากรายการตัวเลือกสัดส่วนภาพในการตั้งค่าอุปกรณ์ ผู้ใช้จะใช้การลบล้างแบบเต็มหน้าจอในแอปของคุณไม่ได้
การตั้งค่าพร็อพเพอร์ตี้นี้เป็น
true
จะไม่มีผล
เพิ่มประสิทธิภาพแอปสำหรับทุกหน้าจอ: อย่าตั้งค่าการจำกัดสัดส่วนภาพในแอป ให้ใช้คลาสขนาดหน้าต่างเพื่อรองรับเลย์เอาต์ต่างๆ ตามจำนวนพื้นที่แสดงผลที่ใช้ได้
การลบล้างระดับแอปของอุปกรณ์
ผู้ผลิตอุปกรณ์และเจ้าของอุปกรณ์เสมือน (เลือกแอปที่เชื่อถือได้และมีสิทธิ์) จะใช้การลบล้างในแต่ละแอปบนอุปกรณ์ที่เฉพาะเจาะจง ซึ่งรวมถึงแท็บเล็ต อุปกรณ์พับได้ อุปกรณ์ ChromeOS และจอแสดงผลในรถยนต์ อุปกรณ์อ้างอิงอาจใช้การลบล้างบางอย่างกับแอปต่างๆ โดยค่าเริ่มต้น
แอปสามารถเลือกไม่ใช้การลบล้างส่วนใหญ่ได้ (ดูตารางการลบล้าง ต่อแอปด้านล่าง)
คุณทดสอบแอปโดยเปิดหรือปิดใช้การลบล้างได้โดยใช้เฟรมเวิร์กความเข้ากันได้ (ดูเครื่องมือเฟรมเวิร์กความเข้ากันได้) เมื่อเปิดใช้ การลบล้างจะมีผลกับทั้งแอป
นอกจากนี้ คุณยังใช้ Android Debug Bridge (adb) เพื่อเปิดหรือปิดใช้ การลบล้าง และพิจารณาว่าการลบล้างใดที่ใช้กับแอปของคุณได้ด้วย
เปิดหรือปิดใช้การลบล้างโดยทำดังนี้
adb shell am compat enable/disable <override name/id> <package>
สำหรับอุปกรณ์อ้างอิง ให้ตรวจสอบว่าการลบล้างใดมีผลกับแอปของคุณ
adb shell dumpsys platform_compat | grep <package name>
ตารางต่อไปนี้แสดงรายการการลบล้างที่ใช้ได้พร้อมกับคําแนะนําเกี่ยวกับวิธี เพิ่มประสิทธิภาพแอปเพื่อให้แอปไม่จําเป็นต้องอาศัยการลบล้าง คุณเพิ่ม แฟล็กพร็อพเพอร์ตี้ลงในไฟล์ Manifest ของแอปเพื่อเลือกไม่ใช้การลบล้างบางอย่างได้
การลบล้างต่อแอป | |||
---|---|---|---|
ประเภท | ชื่อ | รหัส | คำอธิบาย |
การปรับขนาดได้ | FORCE_RESIZE_APP | 174042936 | ข้ามโหมดความเข้ากันได้ของขนาดสำหรับแอปเมื่อมีการเปลี่ยนแปลงการกำหนดค่า |
FORCE_NON_RESIZE_APP | 181136395 | บังคับให้แอปเข้าสู่โหมดความเข้ากันได้ของขนาดเมื่อมีการเปลี่ยนแปลงการกำหนดค่า | |
สัดส่วนภาพ | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | การลบล้าง Gatekeeper ที่ต้องเปิดใช้เพื่อใช้การลบล้างสัดส่วนภาพอื่นๆ |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | หากเปิดใช้ (ค่าเริ่มต้น) ขีดจำกัดจะลบล้างขอบเขตเป็นกิจกรรมแนวตั้งเท่านั้น | |
OVERRIDE_MIN_ASPECT_RATIO_SMALL | 349045028 | เปลี่ยนสัดส่วนภาพขั้นต่ำเป็น 4:3 | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | เปลี่ยนสัดส่วนภาพขั้นต่ำเป็น 3:2 | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | เปลี่ยนสัดส่วนภาพขั้นต่ำเป็น 16:9 | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | เปลี่ยนอัตราส่วนภาพขั้นต่ำให้พอดีกับขนาดการแสดงผล 50% (หรืออัตราส่วนภาพแบบแบ่งหน้าจอ) | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | ปิดใช้การลบล้างอัตราส่วนขั้นต่ำเพื่อให้แอปแสดงแบบเต็มหน้าจอเมื่ออุปกรณ์อยู่ในแนวตั้ง | |
การวางแนว | OVERRIDE_ANY_ORIENTATION | 265464455 | เปิดใช้การลบล้างการวางแนว |
OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | ลบล้างข้อจำกัดด้านการวางแนว การปรับขนาด และสัดส่วนภาพ | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | ลบล้างการวางแนวให้เป็นแนวตั้งเมื่อกิจกรรมมีการวางแนวที่ไม่ได้กำหนด | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | ลบล้างการวางแนวเป็น nosensor (ใช้การวางแนวตามธรรมชาติของอุปกรณ์) เมื่อกิจกรรมมีการวางแนวที่ไม่ได้กำหนด |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | หมุนแอปที่ใช้ได้เฉพาะในแนวนอน 180 องศา | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | จำกัดขอบเขตการลบล้างการวางแนวเมื่อแอปเชื่อมต่อกับกล้อง | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | ตั้งค่าการแสดงผลเป็นแนวนอนคงที่เมื่องานเป็นแบบเต็มหน้าจอ (รวมถึงเมื่อมีแถบดำด้านบนและด้านล่าง) | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | ไม่สนใจคำขอการวางแนวจากแอปเพื่อหลีกเลี่ยงการหมุนวนซ้ำไม่สิ้นสุด | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | ไม่สนใจคำขอการวางแนวที่ซ้ำกันขณะที่กิจกรรมกำลังเปิดตัวอีกครั้ง หาก Android ตรวจพบว่าแอปขอการวางแนวใหม่อย่างน้อย 2 รายการภายใน 1 วินาที ระบบจะถือว่าเป็นการวนซ้ำของการหมุนและใช้การลบล้าง | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | ป้องกันการแสดงจอดำบนและล่างโดยการปิดใช้การตั้งค่าคำขอการวางแนวที่ผู้ผลิตอุปกรณ์เพิกเฉย | |
API แซนด์บ็อกซ์ | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | ป้องกันการเปลี่ยนแปลงลักษณะการทำงานของ API การแสดงผล |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | บังคับให้ Display API ในแอปแสดงขอบเขตของแอป Display API จะแสดงขอบเขตพื้นที่แสดงผลเชิงตรรกะ แต่บางครั้งแอปจะถือว่า Display API แสดงขอบเขตของแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับ UI |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | บังคับให้ View API ที่ใช้ในแอปแสดงขอบเขตของแอป View API จะแสดงขอบเขตพื้นที่แสดงผลเชิงตรรกะ แต่บางครั้งแอปจะถือว่า View API แสดงขอบเขตของแอป ซึ่งทำให้เกิดปัญหาเกี่ยวกับ UI |
|
ความเข้ากันได้ของกล้อง | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | ปิดการหมุนบังคับ โดยค่าเริ่มต้น ระบบจะหมุนแอปกล้องที่กำหนดการวางแนวทั้งหมดโดยอัตโนมัติเมื่อเปิดตัวอย่างกล้อง |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | นำการรีเฟรชแบบฮาร์ดเริ่มต้นออกเมื่อมีการหมุนตัวอย่างกล้องโดยบังคับ | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | เปลี่ยนการรีเฟรชแบบฮาร์ดเป็นการรีเฟรชแบบซอฟต์เมื่อมีการหมุนตัวอย่างกล้องโดยบังคับ ซึ่งจะช่วยรักษาสถานะในระหว่างการหมุนโดยบังคับ โดยค่าเริ่มต้น Android จะทำการรีเฟรชแบบเต็มเมื่อมีการหมุนตัวอย่างกล้องโดยบังคับ การรีเฟรชแบบฮาร์ดอาจทำให้แอปสูญเสียสถานะหรือกลายเป็นสีดำ ทั้งนี้ขึ้นอยู่กับวิธีที่แอปแคชสถานะก่อนหน้า | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | ครอบตัดบัฟเฟอร์รูปภาพของกล้องหน้าด้านใน หากปิดใช้การลบล้าง ระบบจะนำการครอบตัดกล้องหน้าด้านในออกและเพิ่มขอบเขตการมองเห็นของตัวอย่างกล้อง โดยค่าเริ่มต้นในอุปกรณ์พับได้บางรุ่น (ดูอุปกรณ์อ้างอิง) ระบบจะครอบตัดตัวอย่างกล้องของแอปกล้องทั้งหมดเมื่อใช้กล้องหน้าด้านใน | |
เบ็ดเตล็ด | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | ป้องกันไม่ให้แอปเป็นสีดำเมื่อแอปสูญเสียโฟกัสในโหมดแยกหน้าจอ แอปจะรอจนกว่าจะได้รับโฟกัสก่อนที่จะวาดเนื้อหาของแอป ซึ่งอาจทำให้แอปค้างหรือเป็นสีดำ การลบล้างช่วยให้ Android ส่งเหตุการณ์โฟกัสปลอมไปยังแอปได้ ซึ่งจะส่งสัญญาณให้แอปเริ่มวาดเนื้อหาอีกครั้ง |
FORCE_RESIZE_APP
บังคับให้แพ็กเกจที่ใช้การลบล้างสามารถปรับขนาดได้และเข้าสู่โหมดหลายหน้าต่างได้ ใช้ได้กับจอแสดงผลทุกขนาด
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
ในไฟล์ Manifest ของแอป ให้ตั้งค่าแอตทริบิวต์ android:resizeableActivity
เป็น true
วิธีเพิ่มประสิทธิภาพแอป
ใช้เลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์/แบบปรับได้เพื่อให้แอปปรับให้เข้ากับขนาดการแสดงผลและสัดส่วนภาพทั้งหมดได้ ดู รองรับขนาดการแสดงผลต่างๆ
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าสถานะพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
เป็น
false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างและทำให้แอปปรับขนาดได้
adb shell am compat enable FORCE_RESIZE_APP <package>
วิธีนำการลบล้างออก
adb shell am compat disable FORCE_RESIZE_APP <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
FORCE_NON_RESIZE_APP
บังคับให้แพ็กเกจที่ใช้การลบล้างไม่สามารถปรับขนาดได้และ เข้าสู่โหมดความเข้ากันได้ของขนาดเมื่อมีการเปลี่ยนแปลงการกำหนดค่า ใช้กับขนาดการแสดงผลทั้งหมด
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
ตั้งค่าทั้งแอตทริบิวต์ android:resizeableActivity
และ
android.supports_size_changes
แฟล็กข้อมูลเมตาเป็น false
ในไฟล์ Manifest ของแอป
และประกาศข้อจำกัดการวางแนวหรือสัดส่วนภาพ
วิธีเพิ่มประสิทธิภาพแอป
แอปทั้งหมดที่ทำงานได้ดีเมื่อปรับขนาดควรตั้งค่า android:resizeableActivity
หรือ android.supports_size_changes
เป็น true
ควรปรับปรุงแอปอื่นๆ ให้ทำงานได้ดีเมื่อปรับขนาด ดูที่
android:resizeableActivity
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าสถานะพร็อพเพอร์ตี้ PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
เป็น
false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้างและทําให้แอปปรับขนาดไม่ได้
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
วิธีนำการลบล้างออก
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO
ตัวควบคุมการลบล้างทั้งหมดที่บังคับใช้สัดส่วนภาพขั้นต่ำที่กำหนด
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
ตั้งค่า android:minAspectRatio
ที่ระดับกิจกรรมหรือแอป
วิธีเพิ่มประสิทธิภาพแอป
อย่าตั้งค่าข้อจำกัดอัตราส่วนภาพในแอป ตรวจสอบว่าแอปรองรับ
ขนาดการแสดงผลที่แตกต่างกัน ใช้คลาสขนาดหน้าต่าง
เพื่อรองรับเลย์เอาต์ต่างๆ ตามพื้นที่ที่แอปมี
บนหน้าจอ ดู Compose WindowSizeClass
API และ View
WindowSizeClass
API
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ระบุข้อจำกัดอัตราส่วนภาพหรือตั้งค่าสถานะพร็อพเพอร์ตี้
PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
จำกัดการตั้งค่าแอปที่บังคับใช้อัตราส่วนภาพขั้นต่ำที่กำหนดสำหรับกิจกรรม
ที่มีการวางแนวตั้งเท่านั้น เปิดใช้โดยค่าเริ่มต้นและจะมีผลก็ต่อเมื่อเปิดใช้ OVERRIDE_MIN_ASPECT_RATIO
ด้วย
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_SMALL
กำหนดสัดส่วนภาพขั้นต่ำของกิจกรรมเป็นค่าเล็กๆ (4:3)
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
ตั้งค่าสัดส่วนภาพขั้นต่ำของกิจกรรมเป็นค่าปานกลาง (3:2)
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_LARGE
กำหนดสัดส่วนภาพขั้นต่ำของกิจกรรมเป็นค่าขนาดใหญ่ (16:9)
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
เปิดใช้การใช้อัตราส่วนภาพแบบแยกหน้าจอ อนุญาตให้แอปใช้พื้นที่ทั้งหมด ที่มีในโหมดแยกหน้าจอเพื่อหลีกเลี่ยงการแสดงภาพแบบจอกว้าง
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
ปิดใช้การลบล้างสัดส่วนภาพขั้นต่ำในโหมดเต็มหน้าจอแนวตั้งเพื่อใช้พื้นที่หน้าจอทั้งหมด ที่มี
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_ANY_ORIENTATION
เปิดใช้การลบล้างต่อไปนี้เพื่อลบล้างการวางแนว
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
ตั้งค่าแอตทริบิวต์ไฟล์ Manifest ของ activity:screenOrientation
หรือใช้ API ของ Activity#setRequestedOrientation()
วิธีเพิ่มประสิทธิภาพแอป
แอปของคุณควรรองรับการวางแนวทั้งหมด การเปลี่ยนการวางแนวเป็นการ
เปลี่ยนแปลงการกำหนดค่า ซึ่งจัดการได้ 2 วิธี ได้แก่ การปล่อยให้
ระบบทำลายและสร้างแอปใหม่ หรือจัดการการเปลี่ยนแปลงการกำหนดค่า
ด้วยตนเอง หากคุณจัดการการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง คุณจะรักษาสถานะแอปได้โดยใช้ ViewModel
ในบางกรณี คุณอาจเลือกที่จะล็อก
การวางแนวบนจอแสดงผลขนาดเล็กเท่านั้นได้ แต่การทำเช่นนี้อาจไม่ปรับขนาดได้ดีเท่ากับการ
อนุญาตให้ผู้ใช้หมุนแอปตามต้องการ ใน Android 12L ขึ้นไป
การกำหนดแนวคงที่สามารถลบล้างได้โดยการกำหนดค่าอุปกรณ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการการเปลี่ยนแปลงการกำหนดค่าและการรองรับการวางแนวทั้งหมดได้ที่จัดการการเปลี่ยนแปลงการกำหนดค่า
ภาพรวมของ ViewModel และการจำกัดการวางแนวแอปในโทรศัพท์แต่ไม่ได้จำกัดในอุปกรณ์หน้าจอขนาดใหญ่
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าสถานะพร็อพเพอร์ตี้
PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_ANY_ORIENTATION_TO_USER
ช่วยให้แอปแสดงโฆษณาในพื้นที่โฆษณาที่มีอยู่ได้ ลบล้างข้อจำกัดด้านการวางแนว
ความสามารถในการปรับขนาด และสัดส่วนภาพที่ระบุไว้ในไฟล์ Manifest ของแอป นอกจากนี้
ยังไม่รับสายที่โทรไปยัง
Activity#setRequestedOrientation()
หรือ
Activity#getRequestedOrientation()
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
อย่าตั้งค่าแอตทริบิวต์ไฟล์ Manifest
android:screenOrientation
หรือตั้งค่าแอตทริบิวต์เป็น"user"
ตั้งค่าแอตทริบิวต์ไฟล์ Manifest
android:resizeableActivity
เป็นtrue
ในหน้าจอขนาดเล็ก หากต้องการรองรับการปรับขนาดแอปขณะปิดใช้โหมดหลายหน้าต่าง ด้วย
android:resizeableActivity=false
ให้ตั้งค่าandroid.supports_size_changes
แฟล็กข้อมูลเมตาเป็นtrue
อย่าตั้งค่าminAspectRatio
และmaxAspectRatio
วิธีเพิ่มประสิทธิภาพแอป
เปิดใช้แอปให้รองรับการวางแนวทั้งหมด และอย่าตั้งค่าscreenOrientation
ข้อกำหนดในไฟล์ Manifest ของแอป รองรับการปรับขนาดแอป
โหมดหลายหน้าต่าง และสัดส่วนการแสดงผลทั้งหมดโดยตั้งค่าแอตทริบิวต์ android:resizeableActivity
ในไฟล์ Manifest ของแอปเป็น true
ดู
รองรับขนาดการแสดงผลต่างๆ
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
เปิดใช้การวางแนวตั้งสำหรับกิจกรรมทั้งหมดในแพ็กเกจ หากไม่ได้เปิดใช้ OVERRIDE_ANY_ORIENTATION ระบบจะใช้การลบล้าง เฉพาะในกรณีที่กิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
เปิดใช้การวางแนว nosensor สำหรับกิจกรรมทั้งหมดใน แพ็กเกจ ระบบจะใช้การลบล้างก็ต่อเมื่อกิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ เว้นแต่จะเปิดใช้ OVERRIDE_ANY_ORIENTATION
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
เปิดใช้การวางแนว reverseLandscape สำหรับกิจกรรมทั้งหมดใน แพ็กเกจ ระบบจะใช้การลบล้างก็ต่อเมื่อกิจกรรมไม่ได้ระบุการวางแนวคงที่อื่นๆ เว้นแต่จะเปิดใช้ OVERRIDE_ANY_ORIENTATION
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
ข้อจำกัด OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, และ OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE จะมีผลเมื่อการเชื่อมต่อกล้องทำงานอยู่เท่านั้น
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
จำกัดการวางแนวจอแสดงผลเป็นแนวนอนตามการวางแนวธรรมชาติเมื่อมี เงื่อนไขต่อไปนี้
- กิจกรรมแสดงเต็มหน้าจอ
- ไม่ได้เปิดใช้พร็อพเพอร์ตี้ของคอมโพเนนต์การเลือกไม่ใช้
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
- เปิดใช้การตั้งค่าคำขอการวางแนวที่ผู้ผลิตอุปกรณ์เพิกเฉยสำหรับ จอแสดงผล
- การวางแนวการแสดงผลตามธรรมชาติคือแนวนอน
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
ไม่สามารถใช้งาน ควรแก้ปัญหาในตรรกะของแอปพลิเคชัน
วิธีเพิ่มประสิทธิภาพแอป
วิธีปิดใช้หรือเลือกไม่ใช้การลบล้าง
ตั้งค่าสถานะพร็อพเพอร์ตี้
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
เป็น false
แฟล็กพร็อพเพอร์ตี้เพื่อปรับการลบล้าง
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
คำสั่ง adb เพื่อทดสอบการลบล้าง
วิธีใช้การลบล้าง
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
วิธีนำการลบล้างออก
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
หมายเหตุ: คำสั่งจะมีผลชั่วคราวหรือนำการลบล้างออกเท่านั้น
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
เปิดใช้นโยบายความเข้ากันได้ที่ข้ามการอัปเดตการวางแนวแอปเพื่อตอบสนองต่อแอป
ที่เรียกใช้ Activity#setRequestedOrientation()
เมื่อแอป
เปิดตัวอีกครั้งหรือมีการจัดการความเข้ากันได้ของกล้องที่ใช้งานอยู่
วิธีที่แอปจะให้ผลลัพธ์เหมือนกับการลบล้าง
ตั้งค่าสถานะพร็อพเพอร์ตี้