2010-11-09 8 views
10

Existe-t-il un moyen d'afficher une boîte de dialogue non modale - une boîte de dialogue permettant à l'utilisateur d'interagir avec ce qui était à l'écran avant la boîte de dialogue?boîte de dialogue modérée

Je connais des Toasts, mais ils ne permettent pas l'interaction avec le popup.

Je connais les boîtes de dialogue, mais elles sont modales et ne permettent pas l'interaction avec l'arrière-plan.

Je connais les notifications, mais je veux quelque chose qui soit visible à l'écran. Je veux essentiellement être en mesure de jouer à un jeu ou quelque chose et une fenêtre contextuelle apparaît que j'ai un nouvel e-mail ou quelque chose. Je peux cliquer dessus pour voir mon email, mais je peux attendre qu'il disparaisse si je veux juste continuer à jouer à mon jeu. Est-ce possible sur Android?

+0

Est-ce que vous voulez que votre notification apparaisse seulement dans votre activité ou voulez-vous qu'il apparaisse potentiellement dans d'autres activités? –

+0

seulement mon activité –

Répondre

12

Oui, créez une Activité avec le style Theme.Dialog. C'est une activité normale qui ressemble à un dialogue, tout en étant modérée et en acceptant les événements.

Un exemple:

<activity android:name=".activity.dialog.PhotoDialog" 
      android:label="@string/photo_dialog_title" 
      android:theme="@android:style/Theme.Dialog"/> 

Edité:

En effet Theme.Dialog brouille l'activité sous-jacente et le rend inaccessible. J'avais une exigence similaire ici, je devais montrer le dialogue de progression de téléchargement avec le texte et le bouton d'annulation. La prise principale est dans le réglage WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL et la réinitialisation WindowManager.LayoutParams.FLAG_DIM_BEHIND.

créé un dialogue avec un contenu personnalisé:

if (progressDialog == null) { 
      progressDialog = new Dialog(activityRequestingProgressDialog); 
      progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      progressDialog.setContentView(R.layout.progress_upload); 
      progressBar = (ProgressBar) progressDialog.findViewById(R.id.progressBar); 
      progressText = (TextView) progressDialog.findViewById(R.id.progressText); 
      progressText.setText("0 %"); 
      progressText.setTextSize(18); 
      Button buttonCancel = (Button) progressDialog.findViewById(R.id.btnCancel); 
      buttonCancel.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
        cancelProgressDialog(); 
        stopUpload("Upload cancelled."); 
       } 
      }); 
      Window window = progressDialog.getWindow(); 
      window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
      window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
      window.setGravity(Gravity.BOTTOM); 
      progressDialog.show(); 
     } 

     progressText.setText(text); 
     progressBar.setProgress(percent); 

C'est la mise en page de cette boîte de dialogue:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/progressDialog" 
      android:orientation="vertical" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:layout_centerVertical="true"> 

<TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:textSize="18sp" 
      android:padding="10dp" 
      android:text="@string/progress_title"/> 

<LinearLayout android:id="@+id/progressDialog" 
       android:orientation="horizontal" 
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content" 
       android:padding="10dp" 
       android:layout_centerVertical="true"> 

    <ProgressBar android:id="@+id/progressBar" 
       android:layout_width="150dp" 
       android:layout_height="34dp" 
       android:paddingRight="10dp" 
       android:max="100" 
       android:progress="0" 
       android:fadingEdge="vertical" 
       style="?android:attr/progressBarStyleHorizontal"/> 

    <TextView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:id="@+id/progressText" 
       android:paddingRight="10dp"/> 

    <Button android:layout_height="40dp" 
      android:layout_width="80dp" 
      android:id="@+id/btnCancel" 
      android:text="@string/dialog_cancel"/> 

</LinearLayout> 
</LinearLayout> 
+0

permettrait-elle encore l'interaction avec l'activité derrière elle? –

+0

oui il le permet –

+0

génial! Je vais essayer ça! –

0

Ma mise en œuvre qui était un peu plus hackish mais permet également appuyer sur des boutons d'être pris par la fenêtre d'arrière-plan

_wm = this.getWindowManager(); 
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
_view = layoutInflater.inflate(R.layout.notification, null); 

_params = new WindowManager.LayoutParams(); 
_params.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; 
_params.width = android.view.ViewGroup.LayoutParams.WRAP_CONTENT; 
_params.flags = 
    // this is to keep button presses going to the background window 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
    // this is to enable the notification to recieve touch events 
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 
// background transparant 
_params.format = PixelFormat.TRANSLUCENT; 
_gravity = Gravity.TOP;//Gravity.BOTTOM; 

_wm.addView(_view, _params); 
+0

fonctionne très bien dans de nombreux cas ...mais j'ai une liste de lecture derrière cette boîte de dialogue et je ne peux pas sélectionner de liste de visualisation elt ... aucun conseil pour rendre l'élément listview cliquable? – fvisticot

4

ajoutez simplement FLAG_NOT_TOUCH _MODAL drapeau à votre dialogue

dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
Questions connexes