2010-11-09 16 views
10

¿Hay alguna manera de mostrar un diálogo no modal, un diálogo que permite al usuario interactuar con lo que estaba en la pantalla antes del diálogo, pero también permite al usuario interactuar con el diálogo si se presiona?Diálogo no modal sincronizado

Sé de Toasts, pero no permiten la interacción con la ventana emergente.

Conozco los cuadros de diálogo, pero son modales y no permiten la interacción con el fondo.

Sé de notificaciones, pero quiero algo que sea visible en la pantalla.

Básicamente quiero poder jugar un juego o algo así y aparece una ventana emergente que dice que tengo un nuevo correo electrónico o algo así. Puedo hacer clic para ver mi correo electrónico, pero puedo esperar a que desaparezca si solo quiero seguir jugando. ¿Es esto posible en Android?

+0

¿Quiere que su notificación que aparezca sólo en su actividad o quieres estar en posibilidad de aparecer en otras actividades? –

+0

solo mi actividad –

Respuesta

12

Sí, crea una actividad con estilo Theme.Dialog. Esta es una actividad normal que se parece a un diálogo, sin ser moderada y que acepta eventos.

Un ejemplo:

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

Editado:

hecho Theme.Dialog difumina la actividad subyacente y hace que sea inaccesible. Tenía un requisito similar aquí. Tenía que mostrar el cuadro de diálogo de progreso de carga con el texto y el botón cancelar. La captura principal está en la configuración WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL y restablecer WindowManager.LayoutParams.FLAG_DIM_BEHIND.

Creado un diálogo con contenido personalizado:

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); 

Y esto es el diseño para este diálogo:

<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

¿esto todavía permitiría la interacción con la actividad detrás de él? –

+0

sí, lo permite –

+0

¡increíble! Voy a probar esto! –

0

Mi aplicación, que era un poco más hacker pero también permite presionar un botón a ser capturados por ventana de fondo

_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

funciona bien en muchos casos ...pero tengo una vista de lista detrás de este cuadro de diálogo y no puedo seleccionar ningún listview elt ... ¿algún consejo para hacer que se haga clic en el elemento listview? – fvisticot

4

acaba de agregar FLAG_NOT_TOUCH _MODAL bandera para su diálogo

dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
Cuestiones relacionadas