ניהול מקלדת שניתנת להסרה

סמל של דירוג שלושה כוכבים

תמיכה במקלדות נתיקות עוזרת למקסם את הפרודוקטיביות של המשתמשים במכשירים עם מסך גדול. מערכת Android מפעילה שינוי בהגדרות בכל פעם שמחברים מקלדת למכשיר או מנתקים אותה ממנו, וזה עלול לגרום לאובדן המצב של ממשק המשתמש. האפליקציה יכולה לשמור ולשחזר את המצב שלה, ולאפשר למערכת לטפל ביצירה מחדש של הפעילות, או להגביל את היצירה מחדש של הפעילות לשינויים בהגדרות המקלדת.

בכל המקרים, כל הנתונים שקשורים למקלדת מאוחסנים באובייקט Configuration. השדות keyboard ו-keyboardHidden של אובייקט ההגדרות מכילים מידע על סוג המקלדת ועל הזמינות שלה.

שיטות מומלצות

אפליקציות שמותאמות למסכים גדולים תומכות בכל סוג של מכשיר לקליטת נתונים, ממקלדות תוכנה וחומרה ועד לסטיילוס, עכבר, משטח מגע ומכשירים היקפיים אחרים.

כדי לתמוך במקלדות חיצוניות, צריך לבצע שינויים בהגדרות. אפשר לעשות את זה בשתי דרכים:

  1. תנו למערכת ליצור מחדש את הפעילות שפועלת, ונהלו את מצב האפליקציה.
  2. לנהל את השינוי בהגדרה בעצמכם (הפעילות לא תיווצר מחדש):
    • הצהרה על כל ערכי ההגדרות שקשורים למקלדת
    • יצירת handler לשינוי הגדרות אישיות

באפליקציות פרודוקטיביות, שבהן בדרך כלל נדרשת שליטה מדויקת בממשק המשתמש להזנת טקסט וקלט אחר, אפשר להשתמש בגישה של "עשה זאת בעצמך" כדי לטפל בשינויים בהגדרות האישיות.

במקרים מיוחדים, יכול להיות שתרצו לשנות את פריסת האפליקציה כשמקלדת חומרה מחוברת או מנותקת, למשל כדי לפנות יותר מקום לכלים או לחלונות עריכה.

ב-Jetpack Compose, אתם יכולים להגיב לשינויים בהגדרות המקלדת בשתי דרכים:

  1. ממשק משתמש ריאקטיבי: קוראים את מצב ההגדרות הנוכחי ישירות ב-Composables באמצעות LocalConfiguration.current. ממשק המשתמש משתנה באופן אוטומטי כדי להתאים למצב החדש כשמקלדת מחוברת או מנותקת.
  2. קריאה חוזרת (callback) של תופעת לוואי: משתמשים ב-DisposableEffect עם מודעות למחזור החיים כדי לרשום מאזין לשינויים בהגדרות ב-Activity המארח. כך אפשר להפעיל אירועים שלא קשורים לממשק המשתמש (כמו רישום ביומן או ניתוח נתונים) בלי ליצור מחדש את ה-Activity או ליצור מופע של רכיבי תצוגה מדומים.

אלמנטים

  • ‫android:configChanges: מאפיין של הרכיב <activity> בקובץ המניפסט של האפליקציה. מודיעה למערכת על שינויים בהגדרות שהאפליקציה מנהלת.
  • ‫LocalConfiguration: ספק מקומי שניתן לשילוב וחושף את ה-Configuration של המכשיר הנוכחי.
  • ‫DisposableEffect: ממשק API של Compose להשפעות משניות שמריץ בלוק של קוד כש-Composable נכנס לקומפוזיציה, ומנקה אותו כשהוא יוצא.

צעדים

מצהירים על המאפיין configChanges ומוסיפים ערכים שקשורים למקלדת כדי למנוע יצירה מחדש של הפעילות. לאחר מכן, משתמשים ב-LocalConfiguration.current כדי להתאים באופן דינמי את הפריסה של Composable, או רושמים מאזין להגדרות אישיות באמצעות DisposableEffect.

1. הצהרה על המאפיין configChanges

מעדכנים את הרכיב <activity> בקובץ המניפסט של האפליקציה על ידי הוספת הערכים של keyboard|keyboardHidden לרשימת השינויים בהגדרות שכבר מנוהלות:

<activity
      …
      android:configChanges="...|keyboard|keyboardHidden">

2. תגובה לשינויים בהגדרות המקלדת

כדי לטפל בשינויים בהגדרות ב-Jetpack Compose, משתמשים באחת מהאפשרויות הבאות, בהתאם לפעולה שרוצים לבצע – עדכון של ממשק המשתמש או הפעלה של קריאה חוזרת (callback) של תופעת לוואי:

  • אפשרות א': ממשק משתמש ריאקטיבי (מומלץ)

    קוראים את סוג המקלדת ישירות מ-LocalConfiguration.current. כשמחברים או מנתקים מקלדת פיזית, הערך הזה משתנה, ו-Compose יוצר מחדש באופן אוטומטי את ממשק המשתמש.

    val configuration = LocalConfiguration.current
    val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY
    
    if (isPhysicalKeyboardAttached) {
        // Render layout optimized for physical keyboard
    } else {
        // Render default layout
    }

  • אפשרות ב': מאזין לתופעות לוואי

    אם אתם צריכים להריץ אפקט לוואי (כמו רישום ביומן, עדכון מסד נתונים מקומי או הפעלת ניתוח נתונים) כשההגדרה משתנה, השתמשו ב-DisposableEffect כדי לרשום מאזין לשינוי הגדרה ב-ComponentActivity המארח.

    val context = LocalActivity.current
    DisposableEffect(context) {
        val activity = context as? ComponentActivity
        val listener = Consumer<Configuration> { newConfig ->
            val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY
            // Trigger non-UI actions, analytics, etc.
        }
        activity?.addOnConfigurationChangedListener(listener)
        onDispose {
            activity?.removeOnConfigurationChangedListener(listener)
        }
    }

תוצאות

עכשיו האפליקציה תגיב לחיבור או לניתוק של מקלדת חיצונית בלי ליצור מחדש את הפעילות שמתבצעת.

מקורות מידע נוספים

במאמר שמירת מצבי ממשק המשתמש מוסבר איך לשמור את מצב ממשק המשתמש של האפליקציה במהלך שינויים בהגדרות, כמו חיבור או ניתוק של המקלדת.