ventanas ventana quitar internet habilitar extension emergentes emergente como chrome bloqueo bloquear activar android popupwindow android-menu

android - quitar - ventana emergente whatsapp



Ventana emergente: descartar cuando se hace clic afuera (12)

Descubrí que ninguna de las respuestas provistas me funcionó, excepto el comentario de WareNinja sobre la respuesta aceptada, y la de Marcin S. probablemente también funcionará. Aquí está la parte que funciona para mí:

myPopupWindow.setBackgroundDrawable(new BitmapDrawable()); myPopupWindow.setOutsideTouchable(true);

Alternativamente:

myPopupWindow.setFocusable(true);

No estoy seguro de cuáles son las diferencias, pero el código fuente de ListPopupWindow realmente usa este último cuando su modalidad está establecida en true con setModal, por lo que al menos los desarrolladores de Android consideran que este es un enfoque viable, y es solo una línea.

Tengo una ventana emergente en mi actividad, la cosa es que mi ventana emergente todavía se muestra incluso cuando estoy interactuando con mi actividad (por ejemplo, desplazarse por mi lista). Puedo desplazarme por mi lista y PopupWindow todavía está allí.

Lo que quiero lograr es cuando estoy tocando / desplazando / haciendo clic / etc en la pantalla que no es PopupWindow, quiero descartar el PopupWindow. Al igual que funciona un menú. Si hizo clic fuera del menú, el menú se cerrará.

He intentado setOutsideTouchable(true) pero no cerrará la ventana. Gracias.


El trabajo de sugerencia de @LunaKong es como un amuleto.

Pero configurando mPopupWindow.setFocusable (falso). elimina el toque innecesario requerido para hacer desaparecer la ventana emergente.

Por ejemplo: consideremos que hay una ventana emergente visible en la pantalla y está a punto de hacer clic en un botón. Entonces, en este caso, (si mpopwindow.setFocusable (true)) en el primer clic de un botón popupwindow se descartará. Pero debe hacer clic nuevamente para que el botón funcione. if ** (mpopwindwo.setFocusable (false) ** con un solo clic del botón, cierra la ventana emergente y activa el clic del botón . Espero que ayude.


En algunos casos, hacer que la ventana emergente sea enfocable no es deseable (por ejemplo, puede que no desee que robe el foco de otra vista).

Un enfoque alternativo es usar un interceptor táctil:

popupWindow.setOutsideTouchable(true); popupWindow.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { popupWindow.dismiss(); } return false; } });


Establecer el fondo de la ventana transparente:

PopupWindow.getBackground().setAlpha(0);

Después de configurar su fondo en el diseño. Funciona bien.


Gracias por la respuesta de @LunarKong y la confirmación de @ HourGlass. No quiero hacer un comentario duplicado, solo quiero dejarlo claro y conciso.

// Closes the popup window when touch outside. This method was written informatively in Google''s docs. mPopupWindow.setOutsideTouchable(true); // Set focus true to make prevent touch event to below view (main layout), which works like a dialog with ''cancel'' property => Try it! And you will know what I mean. mPopupWindow.setFocusable(true); // Removes default background. mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

Mttdat.


Intente establecer setBackgroundDrawable en PopupWindow que debe cerrar la ventana si toca fuera de él.


Me encontré con los mismos problemas, y lo arreglé como los códigos a continuación. Funciona bien para mí.

// Closes the popup window when touch outside. mPopupWindow.setOutsideTouchable(true); mPopupWindow.setFocusable(true); // Removes default background. mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

Por cierto, no use el constructor en desuso de BitmapDrawable, use este nuevo ColorDrawable (android.R.color.transparent) para reemplazar el fondo predeterminado.

Que te diviertas@.@


Para ListPopupWindow configure la ventana como un modal cuando se muestre.

mListPopupWindow.setModal(true);

De esa forma, hacer clic fuera de ListPopupWindow lo descartará.


Sé que es tarde pero me doy cuenta de que la gente todavía tiene un problema con la ventana emergente. He decidido escribir un ejemplo totalmente funcional en el que puede descartar la ventana emergente tocando o haciendo clic fuera de ella o simplemente tocando la ventana. Para hacerlo, crea una nueva clase PopupWindow y copia este código:

PopupWindow.class

public class PopupWindow extends android.widget.PopupWindow { Context ctx; Button btnDismiss; TextView lblText; View popupView; public PopupWindow(Context context) { super(context); ctx = context; popupView = LayoutInflater.from(context).inflate(R.layout.popup, null); setContentView(popupView); btnDismiss = (Button)popupView.findViewById(R.id.btn_dismiss); lblText = (TextView)popupView.findViewById(R.id.text); setHeight(WindowManager.LayoutParams.WRAP_CONTENT); setWidth(WindowManager.LayoutParams.WRAP_CONTENT); // Closes the popup window when touch outside of it - when looses focus setOutsideTouchable(true); setFocusable(true); // Removes default black background setBackgroundDrawable(new BitmapDrawable()); btnDismiss.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { dismiss(); }}); // Closes the popup window when touch it /* this.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE) { dismiss(); } return true; } }); */ } // End constructor // Attaches the view to its parent anchor-view at position x and y public void show(View anchor, int x, int y) { showAtLocation(anchor, Gravity.CENTER, x, y); } }

Ahora crea el diseño para la ventana emergente: popup.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="1dp" android:orientation="vertical" android:padding="10dp" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="5dp" android:text="PopupWindow Example" android:textColor="#000000" android:textSize="17sp" android:textStyle="italic" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical"> <Button android:id="@+id/btn_dismiss" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dismiss" android:visibility="gone" /> <TextView android:id="@+id/lbl_dismiss" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Touch outside of this box to dismiss" android:textColor="#ffffff" android:textStyle="bold" /> </FrameLayout>

En su actividad principal, cree una instancia de la clase PopupWindow:

final PopupWindow popupWindow = new PopupWindow(this); popupWindow.show(findViewById(R.id.YOUR_MAIN_LAYOUT), 0, -250);

donde YOUR_MAIN_LAYOUT es el diseño de la actividad actual en la que emergerá popupWindow


Tenga en cuenta que para cancelar con popupWindow.setOutsideTouchable(true) , necesita hacer ancho y alto wrap_content como el siguiente código:

PopupWindow popupWindow = new PopupWindow( G.layoutInflater.inflate(R.layout.lay_dialog_support, null, false), WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, true); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(view, Gravity.RIGHT, 0, 0);


popupWindow.setTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

Desconectará la ventana emergente cuando haga clic / toque en la pantalla. Asegúrese de haber configurado la opción Enfoque verdadero antes de mostrar en la ubicación.


mPopWindow.setFocusable(true);