Ich möchte in der Lage sein, den Hintergrund entweder zu verwischen oder zu popup.showAtLocation
dimmen, wenn ich mein Popup-Fenster mit zeige, und den Hintergrund zu verwischen , wenn er popup.dismiss
aufgerufen wird.
Ich habe versucht, Layoutparameter FLAG_BLUR_BEHIND
und FLAG_DIM_BEHIND
meine Aktivität anzuwenden , aber dies scheint den Hintergrund nur zu verwischen und zu dimmen , sobald meine App gestartet wird.
Wie kann ich nur mit Popups verwischen / dimmen?
Antworten:
Die Frage betraf die
Popupwindow
Klasse, doch jeder hat Antworten gegeben, die dieDialog
Klasse verwenden. Das ist ziemlich nutzlos, wenn Sie diePopupwindow
Klasse verwenden müssen, weilPopupwindow
es keinegetWindow()
Methode gibt.Ich habe eine Lösung gefunden, die tatsächlich funktioniert
Popupwindow
. Es ist nur erforderlich, dass das Stammverzeichnis der XML-Datei, die Sie für die Hintergrundaktivität verwenden, a istFrameLayout
. Sie können demFramelayout
Element einandroid:foreground
Tag geben. Mit diesem Tag wird eine zeichnbare Ressource angegeben, die über die gesamte Aktivität gelegt wird (dh wenn das Framelayout das Stammelement in der XML-Datei ist). Sie können dann die Deckkraft (setAlpha()
) des Vordergrundzeichens steuern.Sie können jede beliebige Zeichenressource verwenden, aber wenn Sie nur einen Dimmeffekt wünschen, erstellen Sie eine XML-Datei im Zeichenordner mit dem
<shape>
Tag als root.( Weitere Informationen zum Element finden Sie unter http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape
shape
.) Beachten Sie, dass ich im Farbetikett keinen Alpha-Wert angegeben habe, der das zeichnbare Element transparent machen würde (z#ff000000
. B. ). Der Grund dafür ist, dass jeder fest codierte Alpha-Wert alle neuen Alpha-Werte zu überschreiben scheint, die wir über densetAlpha()
in unserem Code festgelegten Wert festgelegt haben. Das wollen wir also nicht. Dies bedeutet jedoch, dass das zeichnbare Objekt zunächst undurchsichtig ist (fest, nicht transparent). Wir müssen es also in deronCreate()
Methode der Aktivität transparent machen .Hier ist der Framelayout-XML-Elementcode:
Hier ist die onCreate () -Methode der Aktivität:
Schließlich der Code zum Dimmen der Aktivität:
Die Alpha-Werte gehen von
0
(undurchsichtig) bis255
(unsichtbar). Sie sollten die Aktivität aufheben, wenn Sie das Popup-Fenster schließen.Ich habe keinen Code zum Anzeigen und Schließen des Popup-Fensters eingefügt, aber hier ist ein Link, wie dies durchgeführt werden kann: http://www.mobilemancer.com/2011/01/08/popup-window-in-android/
quelle
Da
PopupWindow
nur ein fügtView
zuWindowManager
können Sie mitupdateViewLayout (View view, ViewGroup.LayoutParams params)
der AktualisierungLayoutParams
IhrerPopupWindow
‚scontentView
After - Show - Aufruf .. ().Durch Setzen der Fensterflagge
FLAG_DIM_BEHIND
wird alles hinter dem Fenster abgeblendet. Verwenden SiedimAmount
diese Option , um die Menge an Dim zu steuern (1,0 für vollständig undurchsichtig bis 0,0 für No Dim).Denken Sie daran, dass wenn Sie einen Hintergrund für Ihren festlegen,
PopupWindow
diesercontentView
in einen Container verschoben wird, was bedeutet, dass Sie dessen übergeordnetes Element aktualisieren müssen.Mit Hintergrund:
Ohne Hintergrund:
Marshmallow Update:
In M PopupWindow wird die Inhaltsansicht in ein FrameLayout mit dem Namen mDecorView eingeschlossen. Wenn Sie sich in die PopupWindow-Quelle vertiefen, finden Sie so etwas wie.
createDecorView(View contentView)
Der Hauptzweck von mDecorView besteht darin, Ereignisversand und Inhaltsübergänge zu verarbeiten, die für M neu sind. Dies bedeutet, dass wir eine weitere .getParent () hinzufügen müssen, um auf den Container zuzugreifen.Mit Hintergrund, der eine Änderung an etwas erfordern würde wie:
Bessere Alternative für API 18+
Eine weniger hackige Lösung mit
ViewGroupOverlay
:1) Holen Sie sich das gewünschte Root-Layout
2) Rufen Sie an
applyDim(root, 0.5f);
oderclearDim()
quelle
WindowManager.LayoutParams
. Gibt es eine Problemumgehung?if (p != null) { //same } else { popupView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { v.removeOnLayoutChangeListener(this); WindowManager.LayoutParams p = (WindowManager.LayoutParams) v.getLayoutParams(); p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND; p.dimAmount = 0.3f; wm.updateViewLayout(v, p); } }); }
Fügen Sie in Ihrer XML-Datei so etwas mit Breite und Höhe als 'match_parent' hinzu.
In Ihrer Aktivität oncreate
Machen Sie es schließlich sichtbar, wenn Sie Ihr Popup-Fenster anzeigen, und machen Sie es sichtbar, wenn Sie das Popup-Fenster verlassen.
quelle
Ein weiterer Trick besteht darin, 2 Popup-Fenster anstelle von einem zu verwenden. Das erste Popup-Fenster ist einfach eine Dummy-Ansicht mit durchscheinendem Hintergrund, die den Dimm-Effekt liefert. Das 2. Popup-Fenster ist Ihr beabsichtigtes Popup-Fenster.
Reihenfolge beim Erstellen von Popup-Fenstern: Zeigen Sie zuerst das Dummy-Popup-Fenster und dann das gewünschte Popup-Fenster an.
Reihenfolge beim Zerstören: Schließen Sie das beabsichtigte Popup-Fenster und dann das Dummy-Popup-Fenster.
Die beste Möglichkeit, diese beiden zu verknüpfen, besteht darin, einen OnDismissListener hinzuzufügen und die
onDismiss()
Methode zu überschreiben, mit der das Dummy-Popup-Fenster von ihrem Fenster entfernt werden soll.Code für das Dummy-Popup-Fenster:
fadepopup.xml
Popup anzeigen, um den Hintergrund zu dimmen
quelle
Ich habe eine Lösung dafür gefunden
Erstellen Sie einen benutzerdefinierten transparenten Dialog und öffnen Sie in diesem Dialog das Popup-Fenster:
XML für den Dialog (R.layout.empty):
Jetzt möchten Sie den Dialog schließen, wenn das Popup-Fenster geschlossen wird. so
Hinweis: Ich habe hier das
NewQuickAction
Plugin zum Erstellen von PopupWindow verwendet. Dies kann auch unter nativen Popup-Fenstern erfolgenquelle
Für mich funktioniert so etwas wie die Antwort von Abdelhak Mouaamou, getestet auf API-Level 16 und 27.
Anstatt
popupWindow.getContentView().getParent()
das Ergebnis zu verwenden und umzuwandelnView
(was auf API-Ebene 16 abstürzt, weil dort einViewRootImpl
Objekt zurückgegeben wird, von dem es keine Instanz istView
), verwende ich nur,.getRootView()
das bereits eine Ansicht zurückgibt, sodass dort kein Casting erforderlich ist.Hoffe es hilft jemandem :)
Vollständiges Arbeitsbeispiel, das aus anderen Stackoverflow-Posts zusammengemischt wurde. Kopieren Sie es einfach und fügen Sie es ein, z. B. im onClick-Listener einer Schaltfläche:
quelle
R.id.drawer_layout
ist die ID des Layouts, dessen Helligkeit Sie verringern möchten.quelle
Sie können das verwenden
android:theme="@android:style/Theme.Dialog"
, um das zu tun. Erstellen Sie eine Aktivität undAndroidManifest.xml
definieren Sie die Aktivität in:quelle
ok, also folge ich der Antwort von uhmdown zum Dimmen der Hintergrundaktivität, wenn das Pop-Fenster geöffnet ist. Aber es schafft Probleme für mich. Es handelte sich um eine Dimmaktivität und ein Popup-Fenster (bedeutet, dass sowohl die Aktivität als auch das Popup schwarz gedimmt sind und nicht voneinander getrennt werden können).
also habe ich es so versucht,
Erstellen Sie eine Datei dimming_black.xml für den Dimmeffekt .
Und füge wie
background
inFrameLayout
als Root-XML-Tag hinzu, füge auch meine anderen SteuerelementeLinearLayout
so einlayout.xml
Endlich zeige ich Popup auf meinem
MainActivity
mit einem zusätzlichen Parametersatz wie unten.Ergebnis:
es funktioniert bei mir auch gelöstes problem wie von baDo kommentiert . Damit
Actionbar
kann auch gedimmt werden.Ps ich sage nicht uhmdown's ist falsch. Ich habe aus seiner Antwort gelernt und versucht, mich für mein Problem weiterzuentwickeln. Ich habe auch verwirrt, ob dies ein guter Weg ist oder nicht.
Irgendwelche Vorschläge werden auch geschätzt, auch entschuldigen Sie mein schlechtes Englisch.
quelle
Vielleicht hilft Ihnen dieses Repo: BasePopup
Dies ist mein Repo, mit dem verschiedene Probleme von PopupWindow gelöst werden.
Wenn Sie bei Verwendung der Bibliothek den Hintergrund verwischen müssen, rufen Sie einfach an
setBlurBackgroundEnable(true).
Weitere Informationen finden Sie im Wiki. (Sprache in zh-cn)
BasePopup: Wiki
quelle
Dieser Code funktioniert
quelle