web-dev-qa-db-de.com

Erstellen Sie einen transparenten Dialog über der Aktivität

Hintergrund

Ich versuche, eine Ebene über die aktuelle Aktivität zu legen, in der erklärt wird, was auf dem aktuellen Bildschirm vor sich geht, ähnlich wie bei Kontakt + App .

Ich weiß, dass es dafür einige Lösungen gibt (wie die showCase-Bibliothek und die superToolTips-Bibliothek), und ich weiß auch, dass ich eine Ansicht erstellen und darüber setzen kann, indem ich sie dem Fenster der Aktivität hinzufüge , aber ich muss eine ganze Dialogebene darüber legen.

Problem

Egal was ich versuche, jede Lösung funktioniert nicht so, wie ich es brauche.

kurz gesagt, was ich brauche, ist:

  • vollbild-Dialog.

  • keine Änderung (nicht visuell und nicht logisch) an der Aktionsleiste, der Benachrichtigungsleiste und dem Inhalt der dahinter liegenden Aktivität. Dies bedeutet, dass alles, was sich hinter dem Dialogfeld befindet, gleich bleibt, wie es einen Moment vor der Anzeige des Dialogfelds angezeigt wurde.

  • transparent sein, mit Ausnahme der Ansichten, die ich für den Dialog verwende, der normalerweise angezeigt werden sollte.

was ich versucht habe

Leider habe ich immer nur einen Teil der Dinge, die ich brauchte.

hier ist mein Code:

styles.xml:

<style name="full_screen_dialog">
        <item name="Android:windowFrame">@null</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</item>
        <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

Hauptaktivität.Java:

...
final Dialog dialog = new Dialog(this, R.style.full_screen_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.floating_tutorial);
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
dialog.getWindow().setFormat(PixelFormat.TRANSLUCENT);
dialog.show();

Mit diesem Code wird das Layout über die Aktivität gelegt, aber leider hat es keine Transparenz, obwohl ich es festgelegt habe. Das Layout, das ich verwendet habe, ist sehr einfach, weshalb ich es nicht poste.

Frage

was vermisse ich ? Was ist zu tun, um den Code zu korrigieren?

wie kann ich das Dialogfeld sowohl transparent als auch im Vollbildmodus gestalten, UND dass es die Aktionsleiste und die Benachrichtigungsleiste nicht ändert?.


Funktionierende Lösung

BEARBEITEN: Nachdem Sie eine gute Lösung gefunden haben, ist hier der Arbeitscode:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.floating_tutorial);
    final Window window = dialog.getWindow();
    window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.show();
}
42

Ändern Sie einfach die Hintergrundfarbe Ihres Dialogs:

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

Bearbeiten:

Dies verhindert den Dimmeffekt:

dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
54
Steve Benett

Fügen Sie dies hinzu, es funktioniert wirklich!

<item name="Android:windowIsTranslucent">true</item>
        <item name="Android:windowCloseOnTouchOutside">true</item>
        <item name="Android:windowBackground">@Android:drawable/alert_dark_frame</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:backgroundDimEnabled">false</item>
3