แอปของคุณทำงานได้ดีในโทรศัพท์ที่อยู่ในแนวนอน คุณจึงจำกัด แอปให้แสดงในแนวตั้งเท่านั้น แต่คุณเห็นโอกาสที่จะทำสิ่งต่างๆ ได้มากขึ้นบนหน้าจอขนาดใหญ่ใน แนวนอน
คุณจะทำอย่างไรหากต้องการจำกัดแอปให้แสดงในแนวนอนบนหน้าจอขนาดเล็ก แต่เปิดใช้แนวนอนบนหน้าจอขนาดใหญ่
แนวทางปฏิบัติแนะนำ
แอปที่ดีที่สุดจะเคารพค่ากำหนดของผู้ใช้ เช่น การวางแนวอุปกรณ์
หลักเกณฑ์ด้านคุณภาพของแอปแบบปรับได้แนะนำให้แอปต่างๆ รองรับการกำหนดค่าอุปกรณ์ทั้งหมด ซึ่งรวมถึงการวางแนวตั้งและแนวนอน โหมดหลายหน้าต่าง รวมถึงสถานะพับและกางของอุปกรณ์แบบพับได้ แอปควรเพิ่มประสิทธิภาพเลย์เอาต์และอินเทอร์เฟซผู้ใช้สำหรับการกำหนดค่าต่างๆ และควรบันทึกและกู้คืนสถานะระหว่างการเปลี่ยนแปลงการกำหนดค่า
สูตรนี้เป็นมาตรการชั่วคราว ซึ่งเป็นการรองรับหน้าจอขนาดใหญ่เพียงเล็กน้อย ใช้ สูตรจนกว่าจะปรับปรุงแอปให้รองรับการกำหนดค่าอุปกรณ์ทั้งหมดได้อย่างเต็มที่
ส่วนผสม
screenOrientation: การตั้งค่าไฟล์ Manifest ของแอปที่ช่วยให้คุณระบุได้ วิธีที่แอปตอบสนองต่อการเปลี่ยนแปลงการวางแนวอุปกรณ์Activity#setRequestedOrientation(): วิธีที่คุณสามารถเปลี่ยน การวางแนวแอปในขณะรันไทม์LocalConfiguration: ผู้ให้บริการในเครื่องที่ประกอบกันได้ซึ่งแสดงConfigurationอุปกรณ์ปัจจุบัน ช่วยให้คุณอ่านขนาดหน้าจอในหน่วย DP ได้LaunchedEffect: สร้าง API ผลข้างเคียงที่เรียกใช้บล็อกโค้ด เมื่อคีย์มีการเปลี่ยนแปลง (ในกรณีนี้คือเมื่อการกำหนดค่ามีการเปลี่ยนแปลง)
ขั้นตอน
เปิดใช้แอปเพื่อจัดการการเปลี่ยนแปลงการวางแนวโดยค่าเริ่มต้นในไฟล์ Manifest ของแอป จากนั้นในรันไทม์ ให้ใช้ Jetpack Compose เพื่อจำกัดการวางแนวเป็น แนวตั้งแบบไดนามิกในหน้าจอขนาดกะทัดรัด (โทรศัพท์) ขณะที่อนุญาตการวางแนวทั้งหมดในหน้าจอขนาดใหญ่
1. ระบุการตั้งค่าการวางแนวในไฟล์ Manifest ของแอป
คุณสามารถหลีกเลี่ยงการประกาศองค์ประกอบ screenOrientation ของไฟล์
Manifest ของแอป (ในกรณีนี้ การวางแนวจะเป็น unspecified โดยค่าเริ่มต้น) หรือตั้งค่าการวางแนวหน้าจอเป็น fullUser หากผู้ใช้ไม่ได้ล็อกการหมุนตามเซ็นเซอร์
แอปจะรองรับการวางแนวอุปกรณ์ทั้งหมด
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
ความแตกต่างระหว่างการใช้ unspecified กับ fullUser อาจดูเล็กน้อยแต่มีความสำคัญ หากคุณไม่ประกาศค่า screenOrientation ระบบจะเลือก
การวางแนว และนโยบายที่ระบบใช้เพื่อกำหนดการวางแนวอาจ
แตกต่างกันไปในแต่ละอุปกรณ์ ในทางกลับกัน การระบุ fullUser จะตรงกับลักษณะการทำงานที่ผู้ใช้กำหนดไว้สำหรับอุปกรณ์มากกว่า กล่าวคือ หากผู้ใช้ล็อกการหมุนตามเซ็นเซอร์ แอปจะทำตามค่ากำหนดของผู้ใช้ ไม่เช่นนั้น ระบบจะอนุญาตการวางแนวหน้าจอที่เป็นไปได้ทั้ง 4 แบบ (แนวตั้ง แนวนอน แนวตั้งกลับด้าน หรือแนวนอนกลับด้าน) ดูandroid:screenOrientation
2. จำกัดการวางแนวแบบไดนามิกใน Compose
ใน Jetpack Compose คุณสามารถอ่านขนาดหน้าจอปัจจุบันใน DP แบบรีแอกทีฟ
จาก LocalConfiguration.current และใช้ LaunchedEffect เพื่ออัปเดตการวางแนวของ
Activity เมื่อใดก็ตามที่การกำหนดค่าเปลี่ยนแปลง
หากความกว้างหรือความสูงของหน้าจอต่ำกว่า 600dp (สอดคล้องกับ
เบรกพอยต์ขนาดกะทัดรัดสำหรับโทรศัพท์) ให้จำกัดการวางแนวเป็นแนวตั้ง มิฉะนั้น
ให้ระบบหมุนแอปตามค่ากำหนดของผู้ใช้ (unspecified
หรือ fullUser)
การใช้งานที่สมบูรณ์และคอมไพล์ได้มีดังนี้
val configuration = LocalConfiguration.current val context = LocalActivity.current LaunchedEffect(configuration) { val activity = context ?: return@LaunchedEffect // Determine if screen is compact (phone-sized) in either width or height val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600 activity.requestedOrientation = if (isCompact) { ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } else { ActivityInfo.SCREEN_ORIENTATION_FULL_USER } }
การเพิ่มตรรกะภายในบล็อก LaunchedEffect(configuration) จะช่วยให้คุณ
สามารถลบล้างการตั้งค่าการวางแนวแบบรีแอกทีฟได้ทุกเมื่อที่การกำหนดค่าแอป
มีการเปลี่ยนแปลง เช่น เมื่อมีการปรับขนาดกิจกรรม ย้ายกิจกรรมระหว่างจอแสดงผล หรือเมื่อ
พับหรือกางอุปกรณ์แบบพับได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับเวลาที่การเปลี่ยนแปลงการกำหนดค่าเกิดขึ้นและเวลาที่การเปลี่ยนแปลงดังกล่าวทำให้เกิดการสร้างกิจกรรมใหม่ได้ที่จัดการการเปลี่ยนแปลงการกำหนดค่า
ผลลัพธ์
ตอนนี้แอปของคุณควรยังคงอยู่ในแนวตั้งบนหน้าจอขนาดเล็กไม่ว่าจะหมุนอุปกรณ์อย่างไรก็ตาม ในหน้าจอขนาดใหญ่ แอปควรรองรับการวางแนวแนวนอนและแนวตั้ง
แหล่งข้อมูลเพิ่มเติม
หากต้องการความช่วยเหลือในการอัปเกรดแอปให้รองรับการกำหนดค่าอุปกรณ์ทั้งหมดตลอดเวลา โปรดดูข้อมูลต่อไปนี้