תיבת סימון

תיבות סימון מאפשרות למשתמשים לבחור פריט אחד או יותר מתוך רשימה. אפשר להשתמש בתיבת סימון כדי לאפשר למשתמשים:

  • מפעילים או משביתים פריט.
  • לבחור מתוך כמה אפשרויות ברשימה.
  • מציינים הסכמה או אישור.

אנטומיה

תיבת סימון מורכבת מהרכיבים הבאים:

  • Box: זהו מאגר התוכן של תיבת הסימון.
  • תיבת סימון: זהו האינדיקטור הוויזואלי שמראה אם תיבת הסימון מסומנת או לא.
  • תווית: הטקסט שמתאר את תיבת הסימון.

מדינות

תיבת סימון יכולה להיות באחד משלושת המצבים הבאים:

  • לא מסומנת: תיבת הסימון לא מסומנת. התיבה ריקה.
  • לא נקבע: תיבת הסימון במצב לא נקבע. התיבה מכילה מקף.
  • נבחר: תיבת הסימון מסומנת. התיבה מכילה סימן וי.

בתמונה הבאה מוצגים שלושת המצבים של תיבת סימון.

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

הטמעה

אפשר להשתמש ב-Checkbox composable כדי ליצור תיבת סימון באפליקציה. יש רק כמה פרמטרים חשובים שכדאי לזכור:

  • checked: הערך הבוליאני שמציין אם תיבת הסימון מסומנת או לא.
  • onCheckedChange(): הפונקציה שהאפליקציה קוראת לה כשהמשתמש מקיש על תיבת הסימון.

בדוגמה הבאה אפשר לראות איך משתמשים ב-Checkbox composable:

@Composable
fun CheckboxMinimalExample() {
    var checked by remember { mutableStateOf(true) }

    Row(
        verticalAlignment = Alignment.CenterVertically,
    ) {
        Text(
            "Minimal checkbox"
        )
        Checkbox(
            checked = checked,
            onCheckedChange = { checked = it }
        )
    }

    Text(
        if (checked) "Checkbox is checked" else "Checkbox is unchecked"
    )
}

הסבר

הקוד הזה יוצר תיבת סימון שלא מסומנת בהתחלה. כשמשתמש לוחץ על תיבת הסימון, פונקציית ה-lambda‏ onCheckedChange מעדכנת את המצב checked.

התוצאה

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

תיבת סימון לא מסומנת עם תווית. הטקסט שמתחתיו הוא 'התיבה לא מסומנת'
איור 2. תיבת סימון לא מסומנת

וכך נראית אותה תיבת סימון כשהיא מסומנת:

תיבת סימון מסומנת עם תווית. הטקסט שמתחתיו הוא 'תיבת הסימון מסומנת'
איור 3. תיבת סימון מסומנת

דוגמה מתקדמת

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

@Composable
fun CheckboxParentExample() {
    // Initialize states for the child checkboxes
    val childCheckedStates = remember { mutableStateListOf(false, false, false) }

    // Compute the parent state based on children's states
    val parentState = when {
        childCheckedStates.all { it } -> ToggleableState.On
        childCheckedStates.none { it } -> ToggleableState.Off
        else -> ToggleableState.Indeterminate
    }

    Column {
        // Parent TriStateCheckbox
        Row(
            verticalAlignment = Alignment.CenterVertically,
        ) {
            Text("Select all")
            TriStateCheckbox(
                state = parentState,
                onClick = {
                    // Determine new state based on current state
                    val newState = parentState != ToggleableState.On
                    childCheckedStates.forEachIndexed { index, _ ->
                        childCheckedStates[index] = newState
                    }
                }
            )
        }

        // Child Checkboxes
        childCheckedStates.forEachIndexed { index, checked ->
            Row(
                verticalAlignment = Alignment.CenterVertically,
            ) {
                Text("Option ${index + 1}")
                Checkbox(
                    checked = checked,
                    onCheckedChange = { isChecked ->
                        // Update the individual child state
                        childCheckedStates[index] = isChecked
                    }
                )
            }
        }
    }

    if (childCheckedStates.all { it }) {
        Text("All options selected")
    }
}

הסבר

הנה כמה נקודות שחשוב לשים לב אליהן בדוגמה הזו:

  • ניהול מצב:
    • childCheckedStates: רשימה של ערכים בוליאניים באמצעות mutableStateOf() כדי לעקוב אחרי מצב הסימון של כל תיבת סימון צאצא.
    • parentState: ToggleableState שהערך שלו נגזר מהמצבים של תיבות הסימון של הרכיבים הצאצאים.
  • רכיבי ממשק משתמש:
    • TriStateCheckbox: נדרש לתיבת הסימון של ההורה כי יש לו פרמטר state שמאפשר להגדיר אותו למצב לא ידוע.
    • Checkbox: משמש לכל תיבת סימון של צאצא, כשהמצב שלה מקושר לרכיב המתאים ב-childCheckedStates.
    • Text: הצגת תוויות והודעות ("בחירת הכול", "אפשרות X", "כל האפשרויות נבחרו").
  • לוגיקה:
    • תיבת הסימון של ההורה onClick מעדכנת את כל תיבות הסימון של הצאצאים למצב ההפוך מהמצב הנוכחי של ההורה.
    • כל תיבת סימון של צאצא onCheckedChange מעדכנת את המצב המתאים שלה ברשימה childCheckedStates.
    • הקוד מציג 'All options selected' כשכל תיבות הסימון של הצאצאים מסומנות.

התוצאה

בדוגמה הזו, הרכיב הבא נוצר כשכל תיבות הסימון לא מסומנות.

סדרה של תיבות סימון לא מסומנות עם תוויות.
איור 4. תיבות סימון לא מסומנות

באופן דומה, כך הרכיב נראה כשכל האפשרויות מסומנות, כמו במקרה שבו המשתמש מקיש על 'בחירת הכול':

סדרה של תיבות סימון מסומנות עם תוויות. הראשון מסומן כ 'בחירת הכל'. מתחתיהם יש רכיב טקסט עם הכיתוב 'כל האפשרויות נבחרו'.
איור 5. תיבות סימון מסומנות

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

סדרה של תיבות סימון לא מסומנות עם תוויות. כל האפשרויות לא מסומנות חוץ מאחת. תיבת הסימון עם התווית 'בחירת הכול' לא מסומנת, ומוצג בה מקף.
איור 6. תיבת סימון במצב לא מוגדר

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