चूँकि आप कॉल करने के लिए PopupWindow
सिर्फ एक कहते हैं, शो कॉल करने के बाद अपने 's' को अपडेट करने के लिए उपयोग कर सकते हैं ।View
WindowManager
updateViewLayout (View view, ViewGroup.LayoutParams params)
LayoutParams
PopupWindow
contentView
खिड़की के झंडे FLAG_DIM_BEHIND
को स्थापित करना खिड़की के पीछे सब कुछ मंद कर देगा। dimAmount
मंद की मात्रा को नियंत्रित करने के लिए उपयोग करें (1.0 किसी भी मंद के लिए पूरी तरह से अपारदर्शी के लिए 1.0)।
ध्यान रखें कि यदि आप अपनी पृष्ठभूमि सेट करते हैं, तो PopupWindow
यह आपके contentView
कंटेनर में डाल देगा , जिसका अर्थ है कि आपको इसे अपडेट करने की आवश्यकता है।
पृष्ठभूमि के साथ:
PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(background);
popup.showAsDropDown(anchor);
View container = (View) popup.getContentView().getParent();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) container.getLayoutParams();
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(container, p);
पृष्ठभूमि के बिना:
PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(null);
popup.showAsDropDown(anchor);
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) contentView.getLayoutParams();
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);
मार्शमैलो अपडेट:
M PopupWindow में सामग्री को एक फ़्रेमलेयआउट के अंदर लपेटता है जिसे mDecorView कहा जाता है। यदि आप PopupWindow स्रोत में खुदाई करते हैं, तो आपको कुछ ऐसा मिलेगा createDecorView(View contentView)
। mDecorView का मुख्य उद्देश्य ईवेंट प्रेषण और सामग्री संक्रमणों को संभालना है, जो एम। के लिए नए हैं। इसका मतलब है कि कंटेनर को एक्सेस करने के लिए हमें एक और .getParent () को जोड़ना होगा।
ऐसी पृष्ठभूमि के लिए जिसे कुछ बदलाव की आवश्यकता होगी जैसे:
View container = (View) popup.getContentView().getParent().getParent();
एपीआई 18+ के लिए बेहतर विकल्प
एक कम हैसी समाधान का उपयोग कर ViewGroupOverlay
:
1) वांछित रूट लेआउट की एक पकड़ प्राप्त करें
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) कॉल applyDim(root, 0.5f);
याclearDim()
public static void applyDim(@NonNull ViewGroup parent, float dimAmount){
Drawable dim = new ColorDrawable(Color.BLACK);
dim.setBounds(0, 0, parent.getWidth(), parent.getHeight());
dim.setAlpha((int) (255 * dimAmount));
ViewGroupOverlay overlay = parent.getOverlay();
overlay.add(dim);
}
public static void clearDim(@NonNull ViewGroup parent) {
ViewGroupOverlay overlay = parent.getOverlay();
overlay.clear();
}