האפליקציה פועלת מצוין בטלפונים בתצוגה לאורך, ולכן הגבלתם את האפליקציה לתצוגה לאורך בלבד. אבל אתם רואים הזדמנות לעשות יותר במסכים גדולים בכיוון לרוחב.
איך אפשר להגביל את האפליקציה לכיוון לאורך במסכים קטנים, אבל לאפשר כיוון לרוחב במסכים גדולים?
שיטות מומלצות
האפליקציות הטובות ביותר מכבדות את העדפות המשתמשים, כמו כיוון המכשיר.
בהנחיות האיכות לאפליקציות מותאמות מומלץ שהאפליקציות יתמכו בכל הגדרות המכשיר, כולל פריסה לאורך ולרוחב, מצב ריבוי חלונות ומצבים מקופלים ופתוחים של מכשירים מתקפלים. האפליקציות צריכות לבצע אופטימיזציה של הפריסות וממשקי המשתמש להגדרות שונות, ולשמור ולשחזר את המצב במהלך שינויים בהגדרות.
המתכון הזה הוא פתרון זמני – קורטוב של תמיכה במסכים גדולים. השתמשו במתכון עד שתוכלו לשפר את האפליקציה כך שתספק תמיכה מלאה בכל תצורות המכשירים.
אלמנטים
screenOrientation: הגדרה בקובץ המניפסט של האפליקציה שמאפשרת לציין איך האפליקציה מגיבה לשינויים בכיוון המכשיר-
Activity#setRequestedOrientation(): שיטה שמאפשרת לשנות את כיוון האפליקציה בזמן הריצה -
LocalConfiguration: ספק מקומי שניתן לשילוב וחושף את המכשיר הנוכחיConfiguration, ומאפשר לקרוא את מידות המסך ב-DP. -
LaunchedEffect: ממשק API של אפקט לוואי ב-Compose שמריץ בלוק קוד כשמפתח משתנה (במקרה הזה, כשההגדרות משתנות).
צעדים
מפעילים את האפליקציה כדי לטפל בשינויי כיוון כברירת מחדל בקובץ המניפסט של האפליקציה. לאחר מכן, בזמן הריצה, משתמשים ב-Jetpack Compose כדי להגביל באופן דינמי את הכיוון לאורך במסכים קומפקטיים (טלפונים), ולאפשר את כל הכיוונים במסכים גדולים.
1. מציינים את הגדרת הכיוון בקובץ המניפסט של האפליקציה
אפשר להימנע מהצהרה על הרכיב screenOrientation של קובץ המניפסט של האפליקציה (במקרה כזה, כיוון המסך מוגדר כברירת מחדל ל-unspecified) או להגדיר את כיוון המסך ל-fullUser. אם המשתמש לא נעל את הסיבוב שמבוסס על חיישנים, האפליקציה תתמוך בכל כיווני המכשיר.
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
ההבדל בין השימוש ב-unspecified לבין השימוש ב-fullUser הוא קטן אבל חשוב. אם לא תצהירו על ערך screenOrientation, המערכת תבחר את הכיוון, והמדיניות שבה המערכת משתמשת כדי להגדיר את הכיוון עשויה להשתנות ממכשיר למכשיר. לעומת זאת, אם מציינים את הערך fullUser, ההתנהגות תואמת יותר למה שהמשתמש הגדיר במכשיר: אם המשתמש נעל את הסיבוב שמבוסס על החיישן, האפליקציה תפעל לפי ההעדפה של המשתמש. אחרת, המערכת תאפשר כל אחד מארבעת הכיוונים האפשריים של המסך (לאורך, לרוחב, לאורך הפוך או לרוחב הפוך). 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) מאפשרת לשנות את הגדרת הכיוון באופן ריאקטיבי בכל פעם שמשתנה הגדרת האפליקציה, למשל כשמשנים את גודל הפעילות, כשמעבירים אותה בין מסכים או כשמקפלים או פותחים מכשיר מתקפל.
למידע נוסף על מתי מתרחשים שינויים בהגדרות ומתי הם גורמים ליצירה מחדש של פעילות, עיינו במאמר טיפול בשינויים בהגדרות.
תוצאות
עכשיו האפליקציה אמורה להישאר בכיוון לאורך במסכים קטנים, בלי קשר לסיבוב המכשיר. במסכים גדולים, האפליקציה צריכה לתמוך בכיוון לרוחב ובכיוון לאורך.
מקורות מידע נוספים
כדי לקבל עזרה בשדרוג האפליקציה כך שתתמוך בכל תצורות המכשירים כל הזמן, אפשר לעיין במקורות המידע הבאים: