Gibt es irgendeine Weise, dass Snackbar unter Aktivitätsänderungen bestehen bleibt?

Obwohl Snackbar schön ist, bleibt es nicht bestehen, wenn man Aktivitäten ändert. Dies ist ein bummer in Szenarien, wo ich gerne bestätigen würde, dass eine Nachricht mit einer Snackbar gesendet wurde, bevor die Aktivität beendet wurde. Ich habe überlegt, den Code vor dem Verlassen der Aktivität zu pausieren, aber habe festgestellt, dass eine schlechte Praxis zu sein.

Wenn das, was ich beschreibe, nicht möglich ist, gibt es irgendeine Art von Material Design Toast Nachricht? Oder ein Weg, um eine rechteckige Toast Nachricht zu machen; Einer mit abgerundeten Kanten eines kleineren Radius?

  • Was ist der Unterschied, wenn ich ein Android WebView Objekt mit einem ContextWrapper und einem Kontext erstellen?
  • Wenn Sie stateListAnimator in RecylerViews Element anwenden, wird beim Aufruf von notifyDataSetChanged ein flackernder Effekt verursacht
  • Android: RecyclerView Item, wenn auf klickbare Blöcke onTouch Ereignisse gesetzt
  • So entfernen Sie eine Ansicht, wenn die Animation endet?
  • Wie man SMS von der Android-App sendet, ohne ihre Aufzeichnung in der Geräte-SMS-Ansicht zu machen?
  • Android - umgekehrt die Reihenfolge eines Arrays
  • So legen Sie das Minimum DatePicker Datum auf das aktuelle Datum fest
  • Android Vertical Seek Bar wie Google Play Music App
  • Was ist der Farbcode für Android Hint?
  • IPhone-ähnliche Tab-Bar in Android?
  • Android Multiple Notification
  • "Id kann nicht gelöst werden oder ist kein feld" fehler
  • 4 Solutions collect form web for “Gibt es irgendeine Weise, dass Snackbar unter Aktivitätsänderungen bestehen bleibt?”

    So erstellen Sie eine Snackbar mit dem Anwendungskontext, der über mehrere Aktivitäten hinweg sichtbar ist:

    1. Holen Sie sich den WindowManager als Systemdienst
    2. Erstellen und fügen Sie ein FrameLayout ( rootView ) mit dem Typ WindowManager.LayoutParams.TYPE_TOAST und WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL zum WindowManager
    3. Warten Sie, bis auf FrameLayout.onAttachedToWindow() im FrameLayout ( rootView ) aufgerufen wird.
    4. Holen Sie sich das Fenster-Token des FrameLayout ( rootView ) mit View.getWindowToken()
    5. Erstellen Sie einen ContextThemeWrapper mit dem Anwendungskontext und einem abgeleiteten @style/Theme.AppCompat
    6. Verwenden Sie den neuen Kontext, um einen zusätzlichen FrameLayout ( SnackbarContainer ) zu erstellen.
    7. Fügen Sie dieses FrameLayout ( snackbarContainer ) mit dem Typ WindowManager.LayoutParams.TYPE_APPLICATION_PANEL und FrameLayout Sie FrameLayout
    8. Warten Sie, bis auf View.onAttachedToWindow() im FrameLayout ( View.onAttachedToWindow() aufgerufen wird.
    9. Erstellen Sie die Snackbar wie normal mit dem FrameLayout ( snackbarContainer )
    10. Setzen Sie View.onDismissed() Rückruf in die Snackbar und entfernen Sie die FrameLayouts ( rootView und snackbarContainer )
    11. Snackbar anzeigen Snackbar.show()

    Hier eine Arbeitsumhüllung ( HINWEIS: Wischen Sie ab, um zu entlassen, funktioniert nicht. Vielleicht findet ein anderer die richtigen WindowManager.LayoutParams Flags, um Touch-Events zu erhalten, die von CoordinatorLayout behoben wurden):

     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; } } } 

    BEARBEITEN
    Sobald SnackbarWrapper definiert ist, können Sie es so verwenden:

     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(); 

    Wenn du kein Thema hast, kannst du schnell einen in styles.xml definieren:

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

    Wenn ich es richtig verstehe, machst du das:

    1. Aktivität Ein Start Aktivität B, um eine Nachricht zu senden
    2. Sobald die Nachricht gesendet wird, erscheint eine Bestätigungsnachricht
    3. Sie gehen zurück zu Aktivität A

    Sie können SnackBar verwenden, um dies zu tun, indem Sie eine ActivityResult ( hier ist ein StackOverflow Post mit, wie man es benutzt)

    Hier sind die Schritte:

    1. Aktivität Ein Start Aktivität B mit startActivityForResult
    2. Mach dein Zeug auf Aktivität B
    3. Setzen Sie Ihr Ergebnis (überprüfen Sie den Link oben zu verstehen)
    4. Finish-Aktivität
    5. In Aktivität A, bekomme diesen Code in OnActivityResult und zeige deine SnackBar mit der richtigen Nachricht an

    Hiermit können Sie einen Snackar in Aktivität A anzeigen, der dem Ergebnis der Aktivität B entspricht.

    Hofft, dass es dein Problem helfen kann

    Um einen rechteckigen Toast , legen Sie einen rechteckigen Hintergrund für den Toast oder legen Sie einfach eine andere Hintergrundfarbe für den Toast.

    Verweise diesen Beitrag, wo es als Problem veröffentlicht wurde. Aber es ist dein Fall, es ist eine mögliche Lösung.

    UPDATE: Siehe ausgewählte Antwort.

    Die beste Lösung für meine Frage ist die Verwendung eines Timer nach der Präsentation der Snackbar und dann in der run() -Methode des Timers, beginnend die Aktivität.

     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); 

    UPDATE: Ich habe festgestellt, dass durch die Verwendung von findViewById(android.R.id.content) als die Ansicht in Snackbar.make() die Snackbar weiterhin unter Fragment Änderungen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.