2015-09-24 1 views
3

J'essaie d'avoir un arrière-plan flou derrière un AlertDialog. Le processus se déroule comme suit: prenez une capture d'écran de l'activité et brouillez-la et enregistrez-la dans un bitmap. Puis convertir cette bitmap en un drawable. Ensuite, je définis l'arrière-plan dessinable de la fenêtre de l'alerte en utilisant cette ligne de code renameDialog.getWindow().setBackgroundDrawable(draw); Le problème est que la boîte de dialogue s'affiche uniquement en haut de l'écran même si je force un certain emplacement en spécifiant des paramètres de mise en page. J'ai remarqué que si j'ai changé setBackgroundDrawable à setBackgroundDrawableResource et lui donner un dessin existant, alors la boîte de dialogue est affichée à l'emplacement spécifié.Boîte de dialogue avec un arrière-plan flou à certaines positions

Que faut-il faire pour que le setBackgroundDrawable puisse être utilisé avec un emplacement spécifié dans la boîte de dialogue?

Merci!

 AlertDialog renameDialog = new AlertDialog.Builder(this).create(); 

     LayoutInflater factory = LayoutInflater.from(this); 
     deleteDialogView = factory.inflate(R.layout.dialog_rename_playlist, null); 

     //Getting Blurry screenshot to display it behind dialog 
     Bitmap backgroundScreenshot = Utils.takeScreenShot(PlaylistActivity.this); 
     Bitmap blurryBackground = Utils.getBlurredBitmap(backgroundScreenshot, 30); 

     WindowManager.LayoutParams wmlp = renameDialog.getWindow().getAttributes(); 
     wmlp.gravity = Gravity.CENTER_VERTICAL; 
     wmlp.x= 100; 
     wmlp.y= 100; 


     final Drawable draw=new BitmapDrawable(getResources(), blurryBackground); 
     renameDialog.getWindow().setBackgroundDrawable(draw); 

     renameDialog.getWindow().setAttributes(wmlp); 
     renameDialog.setView(deleteDialogView, 0, 0, 0, 0); 
     renameDialog.show(); 
+0

Avez-vous essayé d'installer backround comme dernière action sur la boîte de dialogue? – wasyl

+0

Essayez cette bibliothèque: [Fragment de dialogue flou] (https://github.com/tvbarthel/BlurDialogFragment) –

+0

@wasyl oui je l'ai fait, cela n'a pas fonctionné. Je crois que le problème a aussi à voir avec le style. –

Répondre

0

Bouquet de suppositions

wmlp.gravity = Gravity.CENTER_VERTICAL; //put me in the middle vertically 
wmlp.x= 100; //sorry i have no effect 
wmlp.y= 100;//dude!! you are wasting lines; i have no effect 

faire ce

wmlp.gravity = Gravity.FILL; // i grow up when needed 
wmlp.x= 100; // now i am useful 
wmlp.y= 100; //dude!! you are wasting lines; use wmlp.y = wmlp.x = 100 

Hope it helps

1

En fixant un drawable taille de l'écran arrière-plan de la fenêtre, vous faites le la fenêtre passe aux dimensions en plein écran. Dans ce cas, Gravity.CENTER_VERTICAL ne peut rien faire. Le calcul avec Gravity.CENTER_VERTICAL fonctionne quelque chose comme ceci:

spacingAtTop = spacingAtBottom = (containerHeight - contentHeight)/2 

Après avoir réglé l'arrière-plan, contentHeight est égal à containerHeight. Si possible, envoyez R.layout.dialog_rename_playlist.

Une chose que vous pouvez essayer sans changer beaucoup:

Enroulez le contenu de R.layout.dialog_rename_playlist dans une FrameLayout avec une hauteur réglée sur match_parent. Le parent actuel (appelez-le oldParent) de R.layout.dialog_rename_playlist doit alors avoir sa hauteur définie sur wrap_content et layout_gravity sur center_vertical. Cela devrait au moins amener votre contenu au centre. Mais cela ne réglera pas votre problème de positionnement.

Une approche plus robuste consisterait à utiliser FrameLayout comme conteneur parent pour votre Activity/Fragment. avant d'afficher la boîte de dialogue, prenez une capture d'écran, brouillez-la et réglez-la sur FrameLayout'sau premier plan. Rendre votre fond AlertDialog's transparent, et vous devriez obtenir le même effet.