синхронизированный немодальный диалог - PullRequest
10 голосов
/ 09 ноября 2010

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 09 ноября 2010

Да, создать мероприятие со стилем 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>
4 голосов
/ 28 марта 2012

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

dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);  
0 голосов
/ 17 ноября 2010

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

_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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...