אפשר לקבץ כמה יעדי מיקוד יחד באמצעות המגדיר focusGroup.
הקיבוץ מאפשר לנהל היררכיות של מיקוד, לבודד אזורים לוגיים בממשק המשתמש (כמו סרגלי כלים, פעולות בתיבות דו-שיח או רשימות של כרטיסים) וליירט את המיקוד כשהוא נכנס לאזור או יוצא ממנו.
מושגים שקשורים לקבוצות מיקוד: כניסה, יציאה ומעבר כברירת מחדל
קבוצת מיקוד יוצרת גבול ניווט אחיד סביב יעדי המיקוד המשניים שלה. כדי להבין איך המיקוד עובר את הגבול הזה, צריך להכיר שני מושגים מרכזיים:
- Enter: האירוע שמתרחש כשהמיקוד עובר מרכיב כלשהו מחוץ לקבוצת המיקוד לרכיב בתוך הקבוצה.
- יציאה: האירוע שמתרחש כשהמיקוד עוזב את הרכיב הפנימי האחרון בקבוצה ועובר ליעד מיקוד חיצוני.
התנהגות ברירת המחדל של מעבר המיקוד
כברירת מחדל, כשקבוצת מיקוד מקבלת מיקוד מבחוץ:
- כניסה לקבוצה: Compose בוחר באופן אוטומטי יעד פנימי למיקוד. בניווט חד-ממדי (Tab), הוא בוחר את הצאצא הראשון לפי סדר ההופעה החזותית. בניווט דו-ממדי (מקשי החיצים או כפתורי החיצים), נבחר הצאצא שהכי קרוב מבחינה גיאומטרית לכיוון הנכנס.
- ניווט בתוך הקבוצה: לחיצות חוזרות על מקש הניווט מעבירות את המיקוד בין יעדי המיקוד באותה רמה שכלולים בקבוצה.
- יציאה מהקבוצה: אחרי שהמשתמש מנווט מעבר ליעד המיקוד האחרון בתוך הקבוצה, הלחיצה הבאה על המקש מוציאה אותו מהקבוצה ומעבירה את המיקוד ליעד המיקוד הסמוך מחוץ לקבוצה.
התאמה אישית של הפניית הכניסה למיקוד
בהרבה עיצובים של ממשקי משתמש, יעד הכניסה שמוגדר כברירת מחדל (למשל, הצאצא הראשון בסדר ההופעה) הוא לא הבחירה הכי הגיונית או נוחה למשתמש.
מטרות ותרחישי שימוש
לדוגמה, תיבת דו-שיח לאישור עם כפתור "ביטול" בצד ימין וכפתור "אישור" ראשי בצד שמאל. כשהמשתמש מנווט למטה אל סרגל הלחצנים משדה בטופס:
- פעולת ברירת מחדל: המיקוד ינחת על "ביטול" כי זה הכפתור הראשון בסדר ההופעה החזותית.
- ההתנהגות הרצויה: מכיוון שהפעולה המומלצת העיקרית היא "אישור", יכול להיות שתרצו שהמיקוד ינחת ישירות על "אישור" כשנכנסים לקבוצת הלחצנים מסדר המיקוד הקודם, ועדיין לאפשר למשתמש ללחוץ על שמאלה כדי לבחור באפשרות "ביטול" במקרה הצורך.
תרחישים נפוצים אחרים לדוגמה:
- העברת המיקוד ישירות לכרטיסייה שנבחרה כשנכנסים אל
TabRow. - העברת המיקוד ישירות לפקד "הפעלה / השהיה" כשנכנסים לסרגל הפעלת המדיה.
הטמעה באמצעות onEnter ו-FocusRequester
כדי להפנות את המיקוד כשנכנסים לקבוצת מיקוד:
- מחילים את המשתנה
focusGroupעל מאגר ההורה שמכיל את יעדי המיקוד הקשורים. - מחילים את המשתנה
focusPropertiesעל הקונטיינר, ומגדירים את הקריאה החוזרת (callback) שלonEnter. - ב-callback של
onEnter(בהיקף שלFocusEnterExitScope), מפעילים אתrequestFocus()ב-FocusRequesterשמשויך לצאצא ברירת המחדל המועדף באמצעותfocusRequester.
val defaultChildRequester = remember { FocusRequester() } Row( modifier = Modifier .focusGroup() .focusProperties { // Intercept entry into this group and redirect focus to the primary action onEnter = { defaultChildRequester.requestFocus() } } ) { Button(onClick = { /* Cancel action */ }) { Text("Cancel") } Button( onClick = { /* Confirm action */ }, modifier = Modifier.focusRequester(defaultChildRequester) ) { Text("Confirm (Default)") } }
בתוך onEnter ו-onExit, אפשר גם להפעיל את cancelFocusChange() כדי לחסום לחלוטין את מעברי המיקוד מעבר לגבול, או לבדוק את requestedFocusDirection כדי להתאים אישית את הניתוב על סמך האופן שבו המשתמש ניווט באמצעות Tab, למטה או שמאלה.
קונטיינרים שניתן לגלול בהם הם קבוצות מיקוד כברירת מחדל
ב-Jetpack Compose, קונטיינרים שאפשר לגלול, כמו LazyRow, LazyColumn ו-LazyVerticalGrid, פועלים באופן אוטומטי כקבוצות מיקוד.
לא צריך להחיל עליהם באופן מפורש את המשתנה focusGroup כדי להגדיר קריאות חוזרות (callbacks) של onEnter או onExit.
מומלץ בשבילך
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- יעדי מיקוד
- סדר המעבר של המיקוד
- התמקדות בשדות טקסט
- החזרת המיקוד
- בקשת מיקוד באופן פרוגרמטי
- בדיקת הניווט באמצעות המיקוד