תמיכה במקלדות נתיקות עוזרת למקסם את הפרודוקטיביות של המשתמשים במכשירים עם מסך גדול. מערכת Android מפעילה שינוי בהגדרות בכל פעם שמחברים מקלדת למכשיר או מנתקים אותה ממנו, וזה עלול לגרום לאובדן המצב של ממשק המשתמש. האפליקציה יכולה לשמור ולשחזר את המצב שלה, ולאפשר למערכת לטפל ביצירה מחדש של הפעילות, או להגביל את היצירה מחדש של הפעילות לשינויים בהגדרות המקלדת.
בכל המקרים, כל הנתונים שקשורים למקלדת מאוחסנים באובייקט Configuration. השדות keyboard ו-keyboardHidden של אובייקט ההגדרות מכילים מידע על סוג המקלדת ועל הזמינות שלה.
שיטות מומלצות
אפליקציות שמותאמות למסכים גדולים תומכות בכל סוג של מכשיר לקליטת נתונים, ממקלדות תוכנה וחומרה ועד לסטיילוס, עכבר, משטח מגע ומכשירים היקפיים אחרים.
כדי לתמוך במקלדות חיצוניות, צריך לבצע שינויים בהגדרות. אפשר לעשות את זה בשתי דרכים:
- תנו למערכת ליצור מחדש את הפעילות שפועלת, ונהלו את מצב האפליקציה.
- לנהל את השינוי בהגדרה בעצמכם (הפעילות לא תיווצר מחדש):
- הצהרה על כל ערכי ההגדרות שקשורים למקלדת
- יצירת handler לשינוי הגדרות אישיות
באפליקציות פרודוקטיביות, שבהן בדרך כלל נדרשת שליטה מדויקת בממשק המשתמש להזנת טקסט וקלט אחר, אפשר להשתמש בגישה של "עשה זאת בעצמך" כדי לטפל בשינויים בהגדרות האישיות.
במקרים מיוחדים, יכול להיות שתרצו לשנות את פריסת האפליקציה כשמקלדת חומרה מחוברת או מנותקת, למשל כדי לפנות יותר מקום לכלים או לחלונות עריכה.
ב-Jetpack Compose, אתם יכולים להגיב לשינויים בהגדרות המקלדת בשתי דרכים:
- ממשק משתמש ריאקטיבי: קוראים את מצב ההגדרות הנוכחי ישירות ב-Composables באמצעות
LocalConfiguration.current. ממשק המשתמש משתנה באופן אוטומטי כדי להתאים למצב החדש כשמקלדת מחוברת או מנותקת. - קריאה חוזרת (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) } }
תוצאות
עכשיו האפליקציה תגיב לחיבור או לניתוק של מקלדת חיצונית בלי ליצור מחדש את הפעילות שמתבצעת.
מקורות מידע נוספים
במאמר שמירת מצבי ממשק המשתמש מוסבר איך לשמור את מצב ממשק המשתמש של האפליקציה במהלך שינויים בהגדרות, כמו חיבור או ניתוק של המקלדת.