Временный немодальный диалог

Есть ли способ показать немодальный диалог – диалоговое окно, позволяющее пользователю взаимодействовать с тем, что было на экране перед диалогом, но также позволяет пользователю взаимодействовать с диалогом при нажатии?

Я знаю Тосты, но они не позволяют взаимодействовать со всплывающим окном.

Я знаю Dialogs, но они модальные и не позволяют взаимодействовать с фоном.

Я знаю об уведомлениях, но мне нужно что-то видимое на экране.

Я в основном хочу быть в состоянии играть в игру или что-то еще, и появляется всплывающее окно, что у меня есть новое письмо или что-то еще. Я могу щелкнуть по нему, чтобы просмотреть мой адрес электронной почты, но я могу дождаться, пока он исчезнет, ​​если я просто хочу продолжить игру. Возможно ли это в Android?

Да, создайте Activity со стилем Theme.Dialog . Это нормальная деятельность, которая выглядит как диалог, будучи немодальной и принимающей события.

Пример:

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

Отредактировано :

В самом деле Theme.Dialog размывает основную деятельность и делает ее недоступной. У меня было аналогичное требование здесь, я должен был показать диалог выполнения загрузки с текстом и кнопкой отмены. Основной улов заключается в установке WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL и сбросе WindowManager.LayoutParams.FLAG_DIM_BEHIND .

Создал диалог с настраиваемым контентом:

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

И это макет для этого диалога:

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

Просто добавьте флаг FLAG_NOT_TOUCH_MODAL в ваш диалог

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

Моя реализация была немного более хакерской, но также позволяла нажатию на кнопки нажатием фонового окна

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