Domanda

C'è un modo per mostrare una finestra di dialogo non modale -? Una finestra di dialogo che permette all'utente di interagire con tutto ciò che era sullo schermo prima che la finestra di dialogo, ma permette anche all'utente di interagire con la finestra di dialogo se premuto

Lo so di Brindisi, ma non consentono l'interazione con il popup.

Lo so di finestre di dialogo, ma sono modali e non consentire l'interazione con lo sfondo.

Lo so di notifiche, ma voglio qualcosa che è visibile sullo schermo.

Io fondamentalmente vogliono essere in grado di poter giocare un gioco o qualcosa e appare un popup che ho un nuovo e-mail o qualcosa del genere. Posso fare clic per visualizzare la mia email, ma posso aspettare che vada via se voglio solo continuare a giocare il mio gioco. Questo è possibile in Android?

È stato utile?

Soluzione

Sì, creare un'attività con Theme.Dialog stile. Si tratta di una normale attività che si presenta come un dialogo, pur essendo non modale e l'accettazione degli eventi.

Un esempio:

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

A cura :

Infatti Theme.Dialog sfuocature dell'attività sottostante e lo rende inaccessibile. Ho avuto un requisito analogo qui ho dovuto mostrare il caricamento finestra di avanzamento con testo e pulsante di annullamento. La cattura principale è nella creazione WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL e resettando WindowManager.LayoutParams.FLAG_DIM_BEHIND.

Creata una finestra di dialogo con il contenuto personalizzato:

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

E questo è il layout per questa finestra di dialogo:

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

Altri suggerimenti

è sufficiente aggiungere FLAG_NOT_TOUCH_MODAL la bandiera alla finestra di dialogo

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

La mia realizzazione che era un po 'più di hacker, ma permette anche la pressione dei pulsanti per rientrare nel campo di sfondo della finestra

_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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top