סדר המעבר בין רכיבים

המשתמשים יכולים להעביר את המיקוד במקלדת בין רכיבי ממשק המשתמש באמצעות מקש Tab או מקשי הכיוון (חיצים או לחצני D-pad):

  • ‫Tab / Shift+Tab: העברת המיקוד קדימה או אחורה בסדר ההצגה החד-ממדי.
  • מקשי החיצים: מעבירים את המיקוד בצורה דו-ממדית (למעלה, למטה, שמאלה וימינה).

העברת המיקוד במימד אחד

במעבר מיקוד חד-ממדי, המיקוד עובר בממשק המשתמש באמצעות המקש Tab, לפי סדר המיקום החזותי במסך.

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

Column {
    Row {
        Button(onClick = { /* ... */ }) { Text("1st") }
        Button(onClick = { /* ... */ }) { Text("2nd") }
    }
    Row {
        Button(onClick = { /* ... */ }) { Text("3rd") }
        Button(onClick = { /* ... */ }) { Text("4th") }
    }
}

לחיצה על המקש Tab מעבירה את המיקוד ברצף בין הכפתורים בסדר הבא:

  1. הכפתור הראשון (למעלה מימין)
  2. הלחצן השני (במכשירים מתקדמים)
  3. הכפתור השלישי (מימין למטה)
  4. הכפתור הרביעי (בחלק התחתון)

לחיצה על Tab ברכיב האחרון מחזירה את המיקוד אל יעד המיקוד הראשון. לחיצה על Shift+Tab מעבירה את המיקוד בסדר הפוך.

מעבר בין רכיבים דו-ממדי

לחיצה על מקשי החיצים במקלדת או שימוש בD-pad מפעילה מעבר מיקוד דו-ממדי.

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

המעבר בין רכיבים במיקוד דו-ממדי לא חוזר לתחילת הרשימה. אם המשתמש לוחץ על המקש Down כשהמיקוד הוא על הרכיב התחתון ביותר, המיקוד נשאר על הרכיב הזה ולא קופץ לחלק העליון של המסך.

איפוס של מעבר המיקוד באמצעות קליקים של מצביע

כשעוברים בין מקלדת פיזית לבין עכבר או לוח מגע במחשב או במכשירים עם מסך גדול:

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

פרטים על ניקוי המיקוד באופן פרוגרמטי זמינים במאמר העברה וניקוי של המיקוד.

התאמה אישית של סדר ההעברה של המיקוד

אפשר להתאים אישית את התנהגות המעבר באמצעות מקש הצירוף focusProperties.

התאמה אישית של סדר המעבר החד-ממדי

כדי לשנות את סדר ההליכה החד-ממדית, צריך לציין את המאפיין next או previous עם הערך FocusRequester.

  1. יצירת אובייקט FocusRequester עם remember { FocusRequester() }.
  2. מצרפים את FocusRequester לרכיב הקומפוזבילי של היעד באמצעות משנה (modifier) focusRequester.
  3. מוסיפים את משנה המקשים focusProperties לרכיב המקור שאפשר להוסיף לו תוכן, ומקצים את FocusRequester ל-next (ל-Tab) או ל-previous (ל-Shift+Tab).

val (first, second, third) = remember { FocusRequester.createRefs() }

Column {
    Button(
        onClick = { /* ... */ },
        modifier = Modifier
            .focusRequester(first)
            .focusProperties { next = third }
    ) {
        Text("First (Tab jumps to Third)")
    }
    Button(
        onClick = { /* ... */ },
        modifier = Modifier.focusRequester(second)
    ) {
        Text("Second")
    }
    Button(
        onClick = { /* ... */ },
        modifier = Modifier.focusRequester(third)
    ) {
        Text("Third")
    }
}

התאמה אישית של סדר הניווט הדו-ממדי

באופן דומה, אפשר לשנות את סדר ההעברה של המיקוד הדו-ממדי על ידי הקצאת מופעים של FocusRequester ל-up,‏ down,‏ start,‏ end,‏ left או right בתוך focusProperties:

val (topButton, bottomButton) = remember { FocusRequester.createRefs() }

Button(
    onClick = { /* ... */ },
    modifier = Modifier
        .focusRequester(topButton)
        .focusProperties {
            down = bottomButton
            right = bottomButton
        }
) {
    Text("Top button")
}
Button(
    onClick = { /* ... */ },
    modifier = Modifier.focusRequester(bottomButton)
) {
    Text("Bottom button")
}

כדי לחסום את הניווט באמצעות המיקוד בכיוון מסוים (לדוגמה, בגבולות פריסת הרכיבים), צריך להקצות את הערך FocusRequester.Cancel למאפיין הזה (לדוגמה, down = FocusRequester.Cancel). כדי לשמור באופן מפורש על אלגוריתם המעבר שמוגדר כברירת מחדל במערכת לכיוון מסוים, צריך להקצות את הערך FocusRequester.Default.