Pregunta

¿Hay alguna manera de mostrar un cuadro de diálogo modal - un cuadro de diálogo que permite al usuario interactuar con todo lo que estaba en la pantalla antes de que el diálogo sino que también permite al usuario interactuar con el cuadro de diálogo si se pulsa

No conozco tostadas, pero que no permiten la interacción con el emergente.

No conozco diálogos, pero son modal y no permiten la interacción con el fondo.

Sé de Notificaciones, pero quiero algo que es visibile en la pantalla.

Básicamente quiero ser capaz de estar jugando un juego o algo y aparece una ventana emergente que tengo un nuevo correo electrónico o algo así. Puedo hacer clic en él para ver mi correo electrónico, pero no puedo esperar a que se vaya si sólo quiero seguir jugando mi juego. ¿Es esto posible en Android?

¿Fue útil?

Solución

Sí, crear una actividad con Theme.Dialog estilo. Esta es una actividad normal que se parece a un cuadro de diálogo, al tiempo que no modal y la aceptación de los acontecimientos.

Un ejemplo:

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

Editado

De hecho Theme.Dialog difumina la actividad correspondiente y hace que sea inaccesible. Tuve un requisito similar aquí que tenía que mostrar el progreso de carga de diálogo con el texto y el botón de cancelación. La captura principal es en el establecimiento y restablecimiento WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 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 este 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>

Otros consejos

sólo tiene que añadir FLAG_NOT_TOUCH_MODAL bandera a su cuadro de diálogo

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

Mi aplicación que era un poco más hacker pero también permite presionar un botón a ser capturados por la 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top