איך מוסיפים פעולות להודעות

כדאי לנסות את הדרך של Compose
‫Jetpack Compose היא ערכת הכלים המומלצת לבניית ממשק משתמש ל-Android. איך מוסיפים התראות בכתיבת הודעה

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

התראה קצרה עם כפתור לביטול הפעולה
איור 1. ‫Snackbar עם כפתור לביטול פעולה שמשחזר פריט שהוסר.

כדי להוסיף פעולה להודעה Snackbar, מגדירים אובייקט listener שמטמיע את הממשק View.OnClickListener. המערכת קוראת לשיטה onClick() של מאזין אם המשתמש מקיש על הצעה לפעולה. לדוגמה, בקטע הקוד הבא מוצג listener לפעולת ביטול:

class MyUndoListener : View.OnClickListener {

    override fun onClick(v: View) {
        // Code to undo the user's last action.
    }
}

אפשר להשתמש באחת מהשיטות של setAction() כדי לצרף את מאזין האירועים ל-Snackbar. מצרפים את ה-listener לפני שמפעילים את show(), כמו בדוגמת קוד זו:

‫
val mySnackbar = Snackbar.make(
    findViewById(R.id.myCoordinatorLayout),
    R.string.email_archived,
    Snackbar.LENGTH_SHORT
)
mySnackbar.setAction(R.string.undo_string, MyUndoListener())
mySnackbar.show()
אם אתם משתמשים ב-Jetpack Compose, אתם יכולים להציג SnackbarHost, כמו בדוגמה הבאה:
override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)

    setContent {
        DACPlaygroundTheme {
            val snackbarHostState = remember { SnackbarHostState() }
            val scope = rememberCoroutineScope()
            Scaffold(
                snackbarHost = { SnackbarHost(snackbarHostState) },
                content = { padding ->
                    Button(
                        modifier = Modifier.padding(padding),
                        onClick = {
                            scope.launch {
                                snackbarHostState.showSnackbar(
                                    message = "1 item removed",
                                    actionLabel = "UNDO",
                                    duration = SnackbarDuration.Short
                                ).run {
                                    when (this) {
                                        Dismissed -> Log.d("SNACKBAR", "Dismissed")
                                        ActionPerformed -> Log.d("SNACKBAR", "UNDO CLICKED")
                                    }
                                }
                            }
                        }
                    ) { Text("Show snackbar") }
                }
            )
        }
    }
}