2010-11-09 15 views
10

Czy istnieje sposób pokazania okna dialogowego bez formy - okna dialogowego, które pozwala użytkownikowi na interakcję z tym, co było na ekranie przed oknem dialogowym, ale także pozwala użytkownikowi na interakcję z oknem dialogowym, jeśli zostanie naciśnięty?Czasowe okno dialogowe niemodalne

Znam toasty, ale nie pozwalają one na interakcję z popupem.

Znam Dialogi, ale są one modalne i nie pozwalają na interakcję z tłem.

Znam powiadomienia, ale chcę czegoś, co jest widoczne na ekranie.

Po prostu chcę być w stanie zagrać w grę lub coś, a pojawi się okienko, że mam nowy e-mail lub coś takiego. Mogę go kliknąć, aby zobaczyć mój e-mail, ale mogę poczekać, aż odejdzie, jeśli chcę kontynuować grę. Czy to możliwe w systemie Android?

+0

Chcieliby Państwo powiadomienie pojawiać się tylko w swojej działalności, czy chcesz go potencjalnie pojawić się w innych działaniach? –

+0

tylko moja aktywność –

Odpowiedz

12

Tak, utwórz opcję ze stylem Theme.Dialog. Jest to normalna czynność, która wygląda jak dialog, a jednocześnie jest niemodna i akceptuje zdarzenia.

Przykład:

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

Pod:

Rzeczywiście Theme.Dialog zaciera aktywności podstawowej i czyni unaccessible. Miałem podobny wymóg tutaj musiałem pokazać okno postępu przesyłania z tekstem i przycisk anulowania. Głównym haczykiem jest ustawienie WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL i resetowanie WindowManager.LayoutParams.FLAG_DIM_BEHIND.

Utworzony Dialog z zawartością niestandardowe:

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

i jest to układ na tym oknie:

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

czy to nadal pozwala na interakcję z działalnością za nim? –

+0

tak to pozwala –

+0

niesamowite! Wypróbuję to! –

0

Moja implementacja który był trochę bardziej hackish ale również pozwala naciska przycisk, aby złapać przez okno tła

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

działa dobrze w wielu przypadkach ... – fvisticot

4

po prostu dodaj FLAG_NOT_TOUCH _MODAL flaga do Twój dialogowe

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