87 votes

Flou ou atténuation de l'arrière-plan lorsque Android PopupWindow est activé

J'aimerais pouvoir flouter ou atténuer l'arrière-plan lorsque je montre ma fenêtre contextuelle avec popup.showAtLocation , et supprimer l'arrière-plan flou / atténué lorsque popup.dismiss est appelé.

J'ai essayé d'appliquer les paramètres de mise en page FLAG_BLUR_BEHIND et FLAG_DIM_BEHIND à mon activité, mais cela semble simplement atténuer et assombrir l'arrière-plan dès que mon application est lancée.

Comment puis-je faire du flou / assombrissement juste avec des popups?

111voto

uhmdown Points 591

La question était de savoir le Popupwindow classe, mais tout le monde a donné les réponses que l'utilisation de l' Dialog classe. C'est assez inutile si vous avez besoin d'utiliser l' Popupwindow classe, parce qu' Popupwindow n'ont pas d' getWindow() méthode.

J'ai trouvé une solution qui fonctionne réellement avec Popupwindow. Il exige seulement que la racine du fichier xml que vous utilisez pour l'activité de fond est un FrameLayout. Vous pouvez donner l' Framelayout élément d'un android:foreground balise. Ce que cette balise n'est spécifier un drawable de ressources qui seront en couches sur le dessus de l'ensemble de l'activité (qui est, si l'Framelayout est l'élément racine du fichier xml). Vous pouvez alors contrôler l'opacité (setAlpha()) de l'avant-plan dessiné.

Vous pouvez utiliser n'importe quel drawable ressource que vous voulez, mais si vous voulez juste un effet d'assombrissement, créer un fichier xml dans le dossier drawable avec l' <shape> balise en tant que root.

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <solid android:color="#000000" />
</shape>

(Voir http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape pour plus d'info sur l' shapeélément). Notez que je n'ai pas spécifier une valeur alpha dans la balise de couleur qui ferait de la drawable élément transparent (e.g #ff000000). La raison pour cela est que tout codé en dur la valeur alpha semble ignorer toute nouvelle alpha valeurs que nous avons définie via l' setAlpha() dans notre code, nous ne voulons pas que. Toutefois, cela signifie que le drawable élément sera initialement opaque (solide, non-transparent). Nous avons donc besoin de la rendre transparente dans l'activité, en onCreate() méthode.

Voici la Framelayout élément xml code:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainmenu"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:foreground="@drawable/shape_window_dim" >
...
... your activity's content
...
</FrameLayout>

Voici l'Activité de l'onCreate() la méthode:

public void onCreate( Bundle savedInstanceState)
{
  super.onCreate( savedInstanceState);

  setContentView( R.layout.activity_mainmenu);

  //
  // Your own Activity initialization code
  //

  layout_MainMenu = (FrameLayout) findViewById( R.id.mainmenu);
  layout_MainMenu.getForeground().setAlpha( 0);
}

Enfin, le code pour varier l'intensité de l'activité:

layout_MainMenu.getForeground().setAlpha( 220); // dim

layout_MainMenu.getForeground().setAlpha( 0); // restore

Les valeurs alpha aller d' 0 (opaque) 255(invisible). Vous devriez onu-dim de l'activité lorsque vous fermez le Popupwindow.

Je n'ai pas inclus de code pour afficher et rejetant le Popupwindow, mais voici un lien pour la façon dont il peut être fait: http://www.mobilemancer.com/2011/01/08/popup-window-in-android/

30voto

user2257590 Points 71

Dans votre fichier XML, ajoutez quelque chose comme ceci avec la largeur et la hauteur sous la forme "match_parent".

 <RelativeLayout
        android:id="@+id/bac_dim_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#C0000000"
        android:visibility="gone" >
</RelativeLayout>
 

Dans votre activité oncreate

 //setting background dim when showing popup
back_dim_layout = (RelativeLayout) findViewById(R.id.share_bac_dim_layout);
 

Enfin, rendez visible lorsque vous affichez votre fenêtre popup et que vous la rendez visible lorsque vous quittez celle-ci.

 back_dim_layout.setVisibility(View.Visible);
back_dim_layout.setVisibility(View.GONE);
 

12voto

Atrix1987 Points 2333

Une autre astuce est d'utiliser 2 fenêtres popup au lieu d'un. La 1ère fenêtre pop-up seront simplement un mannequin vue translucide arrière-plan qui fournit le dim effet. La 2ème fenêtre pop-up est votre fenêtre pop-up.

Séquence tout en créant des fenêtres pop-up: Montrer le mannequin fenêtre pop-up de 1ère et puis le but fenêtre pop-up.

Séquence tout en détruisant: Rejeter le but fenêtre pop-up, puis le mannequin fenêtre pop-up.

La meilleure façon d'établir un lien entre ces deux est d'ajouter une OnDismissListener et remplacer l' onDismiss() méthode de la destiné à dimiss le mannequin fenêtre pop-up à partir de leur.

Code pour le mannequin fenêtre pop-up:

fadepopup.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/fadePopup"
    android:background="#AA000000">
</LinearLayout>

Montrer fondu déroulant pour assombrir l'arrière-plan

private PopupWindow dimBackground() {

    LayoutInflater inflater = (LayoutInflater) EPGGRIDActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View layout = inflater.inflate(R.layout.fadepopup,
            (ViewGroup) findViewById(R.id.fadePopup));
    PopupWindow fadePopup = new PopupWindow(layout, windowWidth, windowHeight, false);
    fadePopup.showAtLocation(layout, Gravity.NO_GRAVITY, 0, 0);
    return fadePopup;
}

5voto

PC. Points 2672

J'ai trouvé une solution pour cela

Créer un dialogue transparent et à l'intérieur de cette boîte de dialogue ouvrir la fenêtre pop-up:

dialog = new Dialog(context, android.R.style.Theme_Translucent_NoTitleBar);
emptyDialog = LayoutInflater.from(context).inflate(R.layout.empty, null);

/* blur background*/
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();  
lp.dimAmount=0.0f;  
dialog.getWindow().setAttributes(lp);  
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 
dialog.setContentView(emptyDialog);
dialog.setCanceledOnTouchOutside(true);
dialog.setOnShowListener(new OnShowListener()
{
    @Override
    public void onShow(DialogInterface dialogIx)
    {
        mQuickAction.show(emptyDialog); //open the PopupWindow here
    }
});
dialog.show();

xml pour le dialogue(R. layout.vide):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="match_parent" android:layout_width="match_parent"
     style="@android:style/Theme.Translucent.NoTitleBar" />

maintenant, vous voulez fermer la boîte de dialogue lorsque la fenêtre Popup rejette. donc

mQuickAction.setOnDismissListener(new OnDismissListener()
{
    @Override
    public void onDismiss()
    {
        if(dialog!=null)
        {
            dialog.dismiss(); // dismiss the empty dialog when the PopupWindow closes
            dialog = null;
        }
    }
});

Note: j'ai utilisé NewQuickAction plugin pour la création de PopupWindow ici. Il peut également être fait sur les Fenêtres Popup

0voto

Macarse Points 36519

Vous pouvez utiliser android:theme="@android:style/Theme.Dialog" pour le faire. Créez une activité et dans votre AndroidManifest.xml définissez l’activité comme:

     <activity android:name=".activities.YourActivity"
              android:label="@string/your_activity_label"
              android:theme="@android:style/Theme.Dialog">
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X