Existe-t-il des moyens de maintenir la Snackbar parmi les changements d'activité?

Bien que Snackbar soit magnifique, il ne persiste pas lors du changement d'activité. C'est un scandale dans les scénarios où j'aimerais confirmer qu'un message a été envoyé à l'aide d'un Snackbar , avant de terminer l'activité. J'ai envisagé de faire une pause du code avant de sortir de l'activité, mais j'ai constaté que c'était une mauvaise pratique.

Si ce que je décris n'est pas possible, y at-il un type de message de toast de conception matérielle? Ou une façon de faire un message de grille rectangulaire; Un avec des bords arrondis d'un rayon plus petit?

  • Rejeter l'appel entrant dans Android
  • Comment faire pivoter l'écran vers le paysage (ou le portrait) de manière programmable?
  • Comment dessiner un polygone rempli?
  • Créer une ombre autour d'une forme dessinée en toile?
  • Déplacer le fichier vidéo capturé par une caméra en utilisant cordova (phonegap) ne modifie pas la miniature de la galerie
  • Processus du téléphone Inondation Sortie LogCat - Comment éliminer ces messages?
  • Android: quel mode audio doit être configuré pour envoyer recevoir de la voix entre les périphériques
  • Android: Comment obtenir les données Google Fit à partir du périphérique Wearable?
  • Après la mise à niveau vers Android Developer Tools version 22, la compilation échoue
  • Comment estimer la distance entre deux appareils Android? (Bluetooth préféré)
  • Autoriser la rotation / le paysage dans un fragment
  • Supprimez ColorFilter / undo setColorFilter
  • 4 Solutions collect form web for “Existe-t-il des moyens de maintenir la Snackbar parmi les changements d'activité?”

    Pour créer une Snackbar avec le contexte de l'application visible dans plusieurs activités:

    1. Obtenez WindowManager tant que service système
    2. Créez et ajoutez FrameLayout ( rootView ) avec le type WindowManager.LayoutParams.TYPE_TOAST et WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL vers WindowManager
    3. Attendez jusqu'à ce que FrameLayout.onAttachedToWindow() soit appelé dans FrameLayout ( rootView )
    4. Obtenez le jeton de fenêtre de FrameLayout ( rootView ) avec View.getWindowToken()
    5. Créez un ContextThemeWrapper avec le contexte de l'application et un @style/Theme.AppCompat dérivé @style/Theme.AppCompat
    6. Utilisez le nouveau contexte pour créer un FrameLayout supplémentaire ( snackbarContainer )
    7. Ajoutez ce FrameLayout ( snackbarContainer ) avec le type WindowManager.LayoutParams.TYPE_APPLICATION_PANEL et flag WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
    8. Attendez jusqu'à ce que View.onAttachedToWindow() soit appelé dans FrameLayout ( snackbarContainer )
    9. Créez la Snackbar comme normale avec FrameLayout ( snackbarContainer )
    10. Set View.onDismissed() rappel à la Snackbar et supprimer FrameLayouts ( rootView et snackbarContainer )
    11. Afficher le snackbar Snackbar.show()

    Ici, une enveloppe fonctionnelle ( REMARQUE: Swipe to dismiss ne fonctionne pas. Peut-être que quelqu'un d'autre trouve les drapeaux WindowManager.LayoutParams corrects pour recevoir les événements tactiles WindowManager.LayoutParams par CoordinatorLayout):

     public class SnackbarWrapper { private final CharSequence text; private final int duration; private final WindowManager windowManager; private final Context appplicationContext; @Nullable private Snackbar.Callback externalCallback; @Nullable private Action action; @NonNull public static SnackbarWrapper make(@NonNull Context applicationContext, @NonNull CharSequence text, @Snackbar.Duration int duration) { return new SnackbarWrapper(applicationContext, text, duration); } private SnackbarWrapper(@NonNull final Context appplicationContext, @NonNull CharSequence text, @Snackbar.Duration int duration) { this.appplicationContext = appplicationContext; this.windowManager = (WindowManager) appplicationContext.getSystemService(Context.WINDOW_SERVICE); this.text = text; this.duration = duration; } public void show() { WindowManager.LayoutParams layoutParams = createDefaultLayoutParams(WindowManager.LayoutParams.TYPE_TOAST, null); windowManager.addView(new FrameLayout(appplicationContext) { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); onRootViewAvailable(this); } }, layoutParams); } private void onRootViewAvailable(final FrameLayout rootView) { final CoordinatorLayout snackbarContainer = new CoordinatorLayout(new ContextThemeWrapper(appplicationContext, R.style.FOL_Theme_SnackbarWrapper)) { @Override public void onAttachedToWindow() { super.onAttachedToWindow(); onSnackbarContainerAttached(rootView, this); } }; windowManager.addView(snackbarContainer, createDefaultLayoutParams(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, rootView.getWindowToken())); } private void onSnackbarContainerAttached(final View rootView, final CoordinatorLayout snackbarContainer) { Snackbar snackbar = Snackbar.make(snackbarContainer, text, duration); snackbar.setCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); // Clean up (NOTE! This callback can be called multiple times) if (snackbarContainer.getParent() != null && rootView.getParent() != null) { windowManager.removeView(snackbarContainer); windowManager.removeView(rootView); } if (externalCallback != null) { externalCallback.onDismissed(snackbar, event); } } @Override public void onShown(Snackbar snackbar) { super.onShown(snackbar); if (externalCallback != null) { externalCallback.onShown(snackbar); } } }); if (action != null) { snackbar.setAction(action.text, action.listener); } snackbar.show(); } private WindowManager.LayoutParams createDefaultLayoutParams(int type, @Nullable IBinder windowToken) { WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.format = PixelFormat.TRANSLUCENT; layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.gravity = GravityCompat.getAbsoluteGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, ViewCompat.LAYOUT_DIRECTION_LTR); layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; layoutParams.type = type; layoutParams.token = windowToken; return layoutParams; } @NonNull public SnackbarWrapper setCallback(@Nullable Snackbar.Callback callback) { this.externalCallback = callback; return this; } @NonNull public SnackbarWrapper setAction(CharSequence text, final View.OnClickListener listener) { action = new Action(text, listener); return this; } private static class Action { private final CharSequence text; private final View.OnClickListener listener; public Action(CharSequence text, View.OnClickListener listener) { this.text = text; this.listener = listener; } } } 

    MODIFIER
    Une fois que SnackbarWrapper est défini, vous pouvez l'utiliser comme ceci:

     final SnackbarWrapper snackbarWrapper = SnackbarWrapper.make(getApplicationContext(), "Test snackbarWrapper", Snackbar.LENGTH_LONG); snackbarWrapper.setAction(R.string.snackbar_text, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Action", Toast.LENGTH_SHORT).show(); } }); snackbarWrapper.show(); 

    Si vous n'avez pas de thème, vous pouvez définir rapidement un dans styles.xml :

     <style name="FOL_Theme_SnackbarWrapper" parent="@style/Theme.AppCompat"> <!--Insert customization here--> </style> 

    Si je comprends bien, vous faites ceci:

    1. Activité Un lancement Activité B pour envoyer un message
    2. Une fois le message envoyé, vous affichez un message de confirmation
    3. Vous revenez à l'activité A

    Vous pouvez utiliser SnackBar pour ce faire en utilisant un ActivityResult ( voici une publication StackOverflow avec comment l'utiliser)

    Voici les étapes suivantes:

    1. Activity Activation B avec startActivityForResult
    2. Faites vos affaires sur l'activité B
    3. Définissez votre résultat (cochez le lien ci-dessus pour comprendre)
    4. Terminer l'activité
    5. Dans l'activité A, obtenez ce code dans OnActivityResult et affichez votre SnackBar avec le message approprié

    Cela vous permet d'afficher un Snackar dans l'Activité A correspondant au résultat de l'Activité B.

    J'espère que cela peut aider votre problème

    Pour avoir un Toast rectangulaire, définissez un fond rectangulaire pour le Toast ou simplement définissez une couleur d'arrière-plan différente pour le Toast.

    Renvoie cette publication où elle a été posté comme un problème. Mais c'est votre cas, c'est une solution possible.

    MISE À JOUR: Voir la réponse sélectionnée.

    La meilleure solution à ma question est d'utiliser une Timer après la présentation de la Snackbar , puis la méthode run() de la minuterie, en commençant l'activité.

     Snackbar.show(); // Excluded make for brevity. Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { Intent chooseVideoIntent = new Intent(Intent.ACTION_GET_CONTENT); // Any type of content/file. Song, doc, video... chooseVideoIntent.setType("video/*"); startActivityForResult(chooseVideoIntent, CHOOSE_VIDEO_REQUEST); } }, 2 * 1000); 

    MISE À JOUR: J'ai constaté qu'en utilisant findViewById(android.R.id.content) que la vue dans Snackbar.make() la Snackbar persiste parmi les modifications de fragments .

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.