2011-09-01 5 views
6

Come aprire un PopupWindow su Android e lasciare tutti gli altri componenti tangibili senza chiudere PopupWindow?Apri una finestra popup e lascia che gli esterni siano ancora tangibili

Questo è quanto è stato creato:

public class DynamicPopup { 
    private final PopupWindow window; 
    private final RectF rect; 
    private final View parent; 
    private final RichPageView view; 

    public DynamicPopup(Context context, RichPage page, RectF rectF, View parent) { 
     this.parent = parent; 
     rect = rectF; 

     window = new PopupWindow(context); 

     window.setBackgroundDrawable(new BitmapDrawable()); 
     window.setWidth((int) rect.width()); 
     window.setHeight((int) rect.height()); 
     window.setTouchable(true); 
     window.setFocusable(true); 
     window.setOutsideTouchable(true); 

     view = new RichPageView(context, page, false); 
     window.setContentView(view); 

     view.setOnCloseListener(new Listener(){ 
      @Override 
      public void onAction() { 
       window.dismiss(); 
      } 
     }); 


    } 

    public void show() { 
     window.showAtLocation(parent, Gravity.NO_GRAVITY, (int) rect.left, (int) rect.top); 
    } 
} 
+2

Hai provato questo metodo? http://developer.android.it/reference/android/widget/PopupWindow.html # setOutsideTouchable% 28boolean% 29 – ernazm

+0

@ernazm, è necessario spostarlo in una risposta. – Phil

+0

Beh, non sono sicuro che questo metodo funzioni come previsto dal momento che non l'ho usato (l'SDK di Android ha un sacco di roba da tbh) e questa domanda è stata sollevata. – ernazm

risposta

8

Come per javadocs

Controlla se il pop-up saranno informati eventi touch al di fuori della sua finestra. Questo ha senso solo per i pop-up che sono toccabile ma non attivabile

Quindi la vostra linea

window.setFocusable(true); 

fa sì che il metodo di setOutsideTouchable() di non fare nulla.

+0

Anche con window.setFocusable (false); questo si chiude di default –

1

Per questo è necessario fatta la finestra Popup personalizzato. In questo devi chiamare un altro layout. Quindi in questo modo puoi accedere anche all'altro componente. È solo il tipo One del layout. Ma puoi impostare la sua apparizione come finestra popup.

<!-- POPUP MENU --> 
    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/popup_window" 
     android:orientation="vertical" 
     android:gravity="center" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/fullwindowborderforpopup" 
     > 



     <LinearLayout 

      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 

      android:padding="1px" 
      android:layout_marginTop="15dip" 
      android:layout_marginLeft="20dip" 
      android:layout_marginRight="20dip" 
      android:layout_marginBottom="10dip" 
      android:background="@drawable/borderforpopup" 
      > 
      <LinearLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_marginTop="5dip" 
       android:layout_marginLeft="3dip" 
       android:layout_marginRight="3dip" 
       android:layout_marginBottom="3dip"> 

       <TextView 
        android:id="@+id/tital_of_popup" 
        android:gravity="center_vertical|center_horizontal" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Event Registration" 
        android:textStyle="bold" 
        android:textColor="#ffffff" 
        /> 
      </LinearLayout> 

      <LinearLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_marginTop="5dip" 
       android:layout_marginLeft="3dip" 
       android:layout_marginRight="3dip" 
       android:layout_marginBottom="3dip" 
      > 

       <TextView 
        android:id="@+id/message_of_popup" 
        android:gravity="center_vertical|center_horizontal" 
        android:layout_height="wrap_content" 
        android:text="Please fill all the data" 
        android:layout_width="wrap_content" 
        android:textStyle="normal" 
        android:textColor="#ffffff" /> 
     </LinearLayout> 
     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_horizontal" 
      android:layout_marginTop="5dip" 
      android:layout_marginLeft="6dip" 
      android:layout_marginRight="6dip" 
      android:layout_marginBottom="9dip" 
       > 


      <Button 
       android:layout_height="fill_parent" 
       android:id="@+id/okbutton" 
       android:text="OK" 
       android:textColor="#ffffff" 
       android:shadowColor="#000000" 
       android:gravity="center" 
       android:layout_width="fill_parent" 
       android:background="@drawable/buttonborderframe"/> 
     </LinearLayout> 
    </LinearLayout> 
</RelativeLayout> 

provare questo. E puoi nascondere e mostrare il layout quando vuoi. E altri campi sono accessibili.

+0

Ho davvero bisogno di aggiungere PopupWindows in runtime, non ce l'ho fino a quando non si esegue. –

+1

Quindi è necessario implementare lo stile personalizzato per la finestra popup e impostare la proprietà come si desidera. –

12

proprio come l'ernazm dicono

Come per javadocs

Controlla se il pop-up saranno informati eventi touch al di fuori della sua finestra. Questo ha senso solo per i pop-up che sono toccabile ma non attivabile

ed è un lavoro sulla

window.setTouchable(true); 
window.setFocusable(false); 
window.setOutsideTouchable(false); 

Quando la finestra touchalbe è vero, attivabile è falso, setOutsideTouchable() è il lavoro, se setOutsideTouchable (true), touch outside di popupwindow termina, altrimenti l'esterno di popupwalows può ancora essere intoccabile senza respingere.

+1

'setTouchable()' è di default 'true'. e 'setOutsideTouchable()' è di default 'false'. Quindi tutto ciò che devi veramente impostare è 'setFocusable (false)'. Ma sembra che gli ascoltatori di eventi non lavorino sulle viste all'interno del popup quando non è focalizzabile. –

+0

È un po 'complicato. I documenti sono corretti ma per qualche motivo, voglio sempre impostare il focusable su true. Le tre impostazioni precedenti funzionano. –

+0

Il mio listener di eventi per gli spinners funziona ma il listener di edittext non lo fa. –

0

Prova ad aggiungere questo codice:

window.setOutsideTouchable(true); 

Dal Android documentation:

void setOutsideTouchable (boolean touchable) 

Controlla se il pop-up saranno informati eventi touch al di fuori della sua finestra. Questo ha senso solo per i pop-up che sono tangibili ma non focalizzabili, il che significa che i tocchi al di fuori della finestra verranno consegnati alla finestra dietro. L'impostazione predefinita è false.

Se il popup viene visualizzato, la chiamata di questo metodo avrà effetto solo la volta successiva che viene visualizzato il popup o tramite una chiamata manuale a uno dei metodi update().

Problemi correlati