סרגלי אפליקציות

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

סוג

מראה

מטרה

סרגל האפליקציה העליון

בחלק העליון של המסך.

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

סרגל האפליקציה התחתון

בחלק התחתון של המסך.

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

דוגמה לסרגל אפליקציות עליון ותחתון.
איור 1. סרגל אפליקציות עליון (משמאל) וסרגל אפליקציות תחתון (מימין).

כדי להטמיע סרגל אפליקציות עליון וסרגל אפליקציות תחתון, משתמשים ברכיבי ה-Composable‏ TopAppBar ו-BottomAppBar, בהתאמה. הם מאפשרים ליצור ממשקים עקביים שמכילים אמצעי בקרה לניווט ולפעולות, ומתאימים לעקרונות של Material Design.

סרגלי אפליקציות עליונים

בטבלה הבאה מפורטים ארבעת הסוגים של סרגלי אפליקציות עליונים:

סוג

דוגמה

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

סרגל אפליקציה עליון קטן

מיושר למרכז: למסכים שיש בהם פעולה ראשית אחת.

סרגל אפליקציות עליון מיושר למרכז

בינוני: למסכים שנדרשת בהם כמות בינונית של ניווט ופעולות.

סרגל אפליקציה עליון בגודל בינוני

גדול: למסכים שנדרשים בהם הרבה ניווטים ופעולות.

סרגל אפליקציה גדול בחלק העליון

משטח API

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

  • title: הטקסט שמופיע בסרגל האפליקציות.
  • navigationIcon: הסמל הראשי לניווט. מופיע בצד ימין של סרגל האפליקציות.
  • actions: סמלים שמאפשרים למשתמש גישה לפעולות מרכזיות. הם מופיעים משמאל לסרגל האפליקציות.
  • scrollBehavior: קובע איך סרגל האפליקציות העליון מגיב לגלילה של התוכן הפנימי של ה-scaffold.
  • colors: קובע איך סרגל האפליקציה יופיע.

התנהגות הגלילה

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

יש שלושה סוגים של TopAppBarScrollBehavior. הם:

  • enterAlwaysScrollBehavior: כשהמשתמש מושך למעלה את התוכן הפנימי של ה-scaffold, סרגל האפליקציה העליון מתכווץ. סרגל האפליקציה מתרחב כשהמשתמש מושך את התוכן הפנימי כלפי מטה.
  • exitUntilCollapsedScrollBehavior: דומה ל-enterAlwaysScrollBehavior, אבל סרגל האפליקציות מתרחב גם כשהמשתמש מגיע לסוף התוכן הפנימי של ה-scaffold.
  • pinnedScrollBehavior: סרגל האפליקציות נשאר במקום ולא מגיב לגלילה.

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

דוגמאות

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

קטן

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

בדוגמה הבאה לא מועבר ערך TopAppBar ל-scrollBehavior, ולכן אין תגובה לגלילה של התוכן הפנימי.

@Composable
fun SmallTopAppBarExample() {
    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Small Top App Bar")
                }
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

ההטמעה הזו נראית כך:

דוגמה לסרגל אפליקציות קטן בחלק העליון.
איור 2. סרגל אפליקציה קטן בחלק העליון.

יישור למרכז

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

בדוגמה הזו נעשה שימוש ב-enterAlwaysScrollBehavior() כדי לקבל את הערך שמועבר ל-scrollBehavior. לכן, הסרגל מתכווץ כשהמשתמש גולל את התוכן הפנימי של ה-scaffold.

@Composable
fun CenterAlignedTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),

        topBar = {
            CenterAlignedTopAppBar(
                colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Centered Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

ההטמעה הזו נראית כך:

דוגמה לסרגל אפליקציות עליון שמיושר למרכז.
איור 3. סרגל אפליקציות עליון עם יישור למרכז.

בינוני

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

כמו בקטע הקוד הקודם, בדוגמה הזו נעשה שימוש ב-enterAlwaysScrollBehavior() כדי לקבל את הערך שמועבר ל-scrollBehavior.

@Composable
fun MediumTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            MediumTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Medium Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

היישום הזה נראה כך, עם הדגמה של התנהגות הגלילה מ-enterAlwaysScrollBehavior():

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

גדול

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

בניגוד לקטעי הקוד הקודמים, בדוגמה הזו נעשה שימוש ב-exitUntilCollapsedScrollBehavior() כדי לקבל את הערך שמועבר ל-scrollBehavior. לכן, הסרגל מתכווץ כשהמשתמש גולל את התוכן הפנימי של ה-scaffold, אבל מתרחב כשהמשתמש גולל לסוף התוכן הפנימי.

@Composable
fun LargeTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            LargeTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Large Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

ההטמעה הזו נראית כך:

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

סרגל האפליקציה התחתון

כדי ליצור סרגל אפליקציות תחתון, משתמשים ב-BottomAppBar composable. השימוש ב-composable הזה דומה מאוד לשימוש ב-composables של סרגל האפליקציות העליון שמתואר בקטעים הקודמים בדף הזה. מעבירים קומפוזבלים לפרמטרים המרכזיים הבאים:

  • actions: סדרה של סמלים שמופיעים בצד ימין של הסרגל. בדרך כלל אלה פעולות מרכזיות במסך הנתון או פריטי ניווט.
  • floatingActionButton: לחצן הפעולה הצף שמופיע בצד שמאל של הסרגל.

@Composable
fun BottomAppBarExample() {
    Scaffold(
        bottomBar = {
            BottomAppBar(
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(Icons.Filled.Check, contentDescription = "Localized description")
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Edit,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Mic,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Image,
                            contentDescription = "Localized description",
                        )
                    }
                },
                floatingActionButton = {
                    FloatingActionButton(
                        onClick = { /* do something */ },
                        containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
                        elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                    ) {
                        Icon(Icons.Filled.Add, "Localized description")
                    }
                }
            )
        },
    ) { innerPadding ->
        Text(
            modifier = Modifier.padding(innerPadding),
            text = "Example of a scaffold with a bottom app bar."
        )
    }
}

ההטמעה הזו נראית כך:

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

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