Временный модный диалог
-
29-09-2019 - |
Вопрос
Есть ли способ отобразить бесконечный диалог-диалог, который позволяет пользователю взаимодействовать с тем, что было на экране перед диалогом, но также позволяет пользователю взаимодействовать с диалогом, если нажат?
Я знаю о тостах, но они не позволяют взаимодействовать с всплывающим окном.
Я знаю о диалогах, но они модальны и не допускают взаимодействия с фоном.
Я знаю об уведомлениях, но я хочу что -то, что визибле на экране.
Я в основном хочу играть в игру или что -то в этом роде, и появляется всплывающее окно, что у меня есть новое электронное письмо или что -то в этом роде. Я могу щелкнуть по нему, чтобы просмотреть свою электронную почту, но я могу ждать, пока она уйдет, если я просто хочу продолжать играть в свою игру. Возможно ли это в Android?
Решение
Да, создайте занятие со стилем 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);