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