cronometrada de diálogo no modal
-
29-09-2019 - |
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?
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);