2011-09-01 5 views
6

¿Cómo abrir una ventana emergente en Android y permitir que todos los demás componentes se puedan tocar sin desestimar la ventana emergente?Abre una ventana emergente y deja que las partes exteriores sigan siendo tocables

Esto es cómo se creó:

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

¿Has probado este método? http://developer.android.com/reference/android/widget/PopupWindow.html # setOutsideTouchable% 28boolean% 29 – ernazm

+0

@ernazm, debe mover esto a una respuesta. – Phil

+0

Bueno, no estoy seguro de que este método funcione como estaba previsto, ya que no lo he usado (el SDK de Android tiene muchas cosas problemáticas) y esta pregunta se ha planteado. – ernazm

Respuesta

8

Según javadocs

controla si el emergente será informado de eventos de toque fuera de su ventana. Esto sólo tiene sentido para las ventanas emergentes que son palpables pero no enfocable

Por lo que su línea de

window.setFocusable(true); 

hace que el método setOutsideTouchable() no hacer nada.

+0

Incluso con window.setFocusable (falso); esto se cierra por defecto –

1

Para que usted tiene que hacer la ventana emergente personalizado. En eso tienes que llamar al otro diseño. De esta forma, puede acceder al otro componente también. Es el único tipo de diseño. Pero puede establecer su apariencia como ventana emergente.

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

prueba esto. Y puede ocultar y mostrar el diseño cuando lo desee. Y otros campos son accesibles.

+0

Realmente necesito agregar PopupWindows en tiempo de ejecución, no tengo hasta que esté en funcionamiento. –

+1

Luego debe implementar el estilo personalizado para la ventana emergente y establecer la propiedad como desee. –

12

al igual que el ernazm dicen

Según javadocs

controla si el emergente será informado de eventos de toque fuera de su ventana. Esto sólo tiene sentido para las ventanas emergentes que son palpables pero no enfocable

y es el trabajo en

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

Cuando la ventana touchalbe es cierto, enfocable es falsa, setOutsideTouchable() es el trabajo, si setOutsideTouchable (true), toque fuera de popupwindow se descartará, de lo contrario, el exterior de popupwindows aún puede tocarse sin que se cierre.

+1

'setTouchable()' es por defecto 'true'. y 'setOutsideTouchable()' es por defecto 'false'. Entonces todo lo que necesitas establecer es 'setFocusable (false)'. Pero parece que los oyentes del evento no trabajan en las vistas dentro de la ventana emergente cuando no es enfocable. –

+0

Es un poco complicado. Los documentos están en lo cierto, pero por alguna razón, siempre quiero establecer el foco en verdadero. Los tres ajustes anteriores funcionan. –

+0

mi detector de eventos para hilanderos funciona pero mi oyente de texto de edición no. –

0

Trate de añadir esto a su código:

window.setOutsideTouchable(true); 

Desde el Android documentation:

void setOutsideTouchable (boolean touchable) 

Controla si la ventana emergente será informado de eventos de toque fuera de su ventana. Esto solo tiene sentido para las ventanas emergentes que son tangibles pero no enfocables, lo que significa que los toques que se encuentran fuera de la ventana se enviarán a la ventana de atrás. El valor predeterminado es false.

Si aparece la ventana emergente, llamar a este método tendrá efecto solo la próxima vez que se muestre la ventana emergente o mediante una llamada manual a uno de los métodos update().

Cuestiones relacionadas