Yana PopupWindow
sadece ekleyen View
için WindowManager
size kullanabilirsiniz updateViewLayout (View view, ViewGroup.LayoutParams params)
güncellemek için LayoutParams
sizin bir PopupWindow
's contentView
gösteriyi çağrıldıktan sonra .. ().
Pencere bayrağını ayarlamak, pencerenin FLAG_DIM_BEHIND
arkasındaki her şeyi karartacaktır. dimAmount
Karartma 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 PopupWindow
koyacağı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();
}