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

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

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

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

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

Kotlin

class MyUndoListener : View.OnClickListener {

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

Java

public class MyUndoListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {

        // Code to undo the user's last action.
    }
}

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

Kotlin

val mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
                               R.string.email_archived, Snackbar.LENGTH_SHORT)
mySnackbar.setAction(R.string.undo_string, MyUndoListener())
mySnackbar.show()

Java

Snackbar mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
        R.string.email_archived, Snackbar.LENGTH_SHORT);
mySnackbar.setAction(R.string.undo_string, new MyUndoListener());
mySnackbar.show();
אם אתם משתמשים ב-Jetpack Compose, תוכלו להציג SnackbarHost, כמו בדוגמה הבאה:

Kotlin

    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") }
                  }
              )
          }
      }
  }