การวางแนวแอปถูกจำกัดในโทรศัพท์ แต่ไม่ได้จำกัดในหน้าจอขนาดใหญ่

ไอคอนการให้ดาว 2 ดวง

แอปของคุณทำงานได้ดีในโทรศัพท์ในแนวตั้ง คุณจึงจำกัดแอปให้แสดงในแนวตั้งเท่านั้น แต่คุณเห็นโอกาสที่จะทำสิ่งต่างๆ ได้มากขึ้นบนหน้าจอขนาดใหญ่ในแนวนอน

คุณจะทำทั้ง 2 อย่างได้อย่างไร นั่นคือจำกัดแอปให้อยู่ในแนวตั้งบนหน้าจอขนาดเล็ก แต่เปิดใช้แนวนอนบนหน้าจอขนาดใหญ่

แนวทางปฏิบัติแนะนำ

สุดยอดแอปจะคำนึงถึงค่ากำหนดของผู้ใช้ เช่น การวางแนวอุปกรณ์

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

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

ส่วนผสม

  • screenOrientation: การตั้งค่าไฟล์ Manifest ของแอปที่ช่วยให้คุณระบุวิธีที่แอปตอบสนองต่อการเปลี่ยนแปลงการวางแนวของอุปกรณ์ได้
  • Activity#setRequestedOrientation(): วิธีที่คุณสามารถเปลี่ยนการวางแนวของแอปขณะรันไทม์
  • LocalConfiguration: ผู้ให้บริการในเครื่องที่ Composable ซึ่งแสดงConfigurationของอุปกรณ์ปัจจุบัน ซึ่งช่วยให้คุณอ่านขนาดหน้าจอในหน่วย dp ได้
  • LaunchedEffect: Compose 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 เพื่ออัปเดตการวางแนวของกิจกรรมเมื่อใดก็ตามที่มีการเปลี่ยนแปลงการกำหนดค่า

หากความกว้างหรือความสูงของหน้าจอน้อยกว่า 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) จะช่วยให้คุณลบล้างการตั้งค่าการวางแนวได้ทุกเมื่อที่มีการเปลี่ยนแปลงการกำหนดค่าแอป เช่น เมื่อมีการปรับขนาดกิจกรรม ย้ายระหว่างจอแสดงผล หรือเมื่อพับหรือกางอุปกรณ์แบบพับได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับช่วงเวลาที่การเปลี่ยนแปลงการกำหนดค่าเกิดขึ้นและช่วงเวลาที่การเปลี่ยนแปลงดังกล่าวทำให้เกิดการสร้างกิจกรรมขึ้นมาใหม่ได้ที่หัวข้อจัดการการเปลี่ยนแปลงการกำหนดค่า

ผลลัพธ์

ตอนนี้แอปของคุณควรยังคงอยู่ในแนวตั้งบนหน้าจอขนาดเล็กไม่ว่าอุปกรณ์จะหมุนอย่างไรก็ตาม ในหน้าจอขนาดใหญ่ แอปควรรองรับการวางแนวทั้งแนวนอนและแนวตั้ง

แหล่งข้อมูลเพิ่มเติม

หากต้องการความช่วยเหลือในการอัปเกรดแอปเพื่อรองรับการกำหนดค่าอุปกรณ์ทั้งหมดตลอดเวลา โปรดดูข้อมูลต่อไปนี้