Frage

Gibt es eine Möglichkeit, einen modalen Dialog zu zeigen - einen Dialog, der den Benutzer erlaubt die Interaktion mit dem, was auf dem Bildschirm vor dem Dialog, sondern ermöglicht der Benutzer auch mit dem Dialog zu interagieren, wenn gedrückt

Ich weiß von Toast, aber sie erlauben keine Interaktion mit dem Pop-up.

Ich kenne Dialoge, aber sie sind modal und erlauben keine Interaktion mit dem Hintergrund.

Ich weiß von Benachrichtigungen, aber ich möchte etwas, das visibile auf dem Bildschirm ist.

Ich mag grundsätzlich in der Lage sein, ein Spiel zu spielen oder etwas und ein Popup erscheint, dass ich eine neue E-Mail oder etwas habe. Ich kann es meine E-Mail anzuzeigen, aber ich kann warten, bis es weg zu gehen, wenn ich will nur mein Spiel weiter zu spielen. Ist das möglich in Android?

War es hilfreich?

Lösung

Ja, eine Aktivität mit Stil Theme.Dialog erstellen. Dies ist eine normale Tätigkeit, die aussieht wie ein Dialog, während sie nicht modale und akzeptieren Ereignisse.

Ein Beispiel:

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

Edited :

Tatsächlich Theme.Dialog verwischt die zugrunde liegende Aktivität und macht es unaccessible. Ich hatte eine ähnliche Anforderung hier hatte ich Fortschrittsdialog mit Text anzuzeigen Upload und Taste. Die Hauptrast ist in WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL Setzen und Zurücksetzen WindowManager.LayoutParams.FLAG_DIM_BEHIND.

ein Dialog mit benutzerdefinierten Inhalt Erstellt:

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

Und das ist das Layout für diesen Dialog:

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

Andere Tipps

fügen Sie einfach FLAG_NOT_TOUCH_MODAL Flag auf Ihren dialog

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

Meine Implementierung, die ein wenig mehr hackish war, sondern ermöglicht auch Taste drückt durch Hintergrund-Fenster gefangen werden

_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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top