Yana PopupWindowsadece ekleyen Viewiçin WindowManagersize kullanabilirsiniz updateViewLayout (View view, ViewGroup.LayoutParams params)güncellemek için LayoutParamssizin bir PopupWindow's contentViewgösteriyi çağrıldıktan sonra .. ().
Pencere bayrağını ayarlamak, pencerenin FLAG_DIM_BEHINDarkasındaki her şeyi karartacaktır. dimAmountKarartma miktarını kontrol etmek için kullanın (tamamen opak için 1.0, dim olmaması için 0.0).
Bir arka plan ayarlarsanız, sizi bir kapsayıcıya PopupWindowkoyacağını unutmayın contentView, bu da ebeveynini güncellemeniz gerektiği anlamına gelir.
Arka plan ile:
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();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(container, p);
Arka plan olmadan:
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();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);
Hatmi Güncellemesi:
M'de PopupWindow, contentView öğesini mDecorView adlı bir FrameLayout içine sarar. PopupWindow kaynağına girerseniz, şöyle bir şey bulacaksınız:createDecorView(View contentView) . MDecorView'in temel amacı, M için yeni olan olay gönderimini ve içerik geçişlerini işlemektir. Bu, konteynere erişmek için bir .getParent () daha eklememiz gerektiği anlamına gelir.
Aşağıdakilere benzer bir değişiklik gerektiren arka plan ile:
View container = (View) popup.getContentView().getParent().getParent();
API 18+ için daha iyi bir alternatif
Daha az hackli bir çözüm kullanarak ViewGroupOverlay :
1) İstenen kök düzenine sahip olun
ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();
2) Çağrı applyDim(root, 0.5f);veyaclearDim()
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();
}