ventanas ventana significa quitar que notificaciones notificacion flotantes emergentes emergente eliminar desactivar como android popupwindow

significa - Problemas al crear una ventana emergente en la actividad de Android



ventana emergente whatsapp (13)

Comprueba que findViewById devuelve algo: es posible que lo llames demasiado pronto, antes de crear el diseño

También es posible que desee publicar una salida logcat para las excepciones que está recibiendo

Estoy intentando crear una ventana emergente que solo aparece la primera vez que se inicia la aplicación. Quiero que muestre algo de texto y tenga un botón para cerrar la ventana emergente. Sin embargo, estoy teniendo problemas para que incluso el PopupWindow funcione. He intentado dos maneras diferentes de hacerlo:

Primero tengo un archivo XML que declara el diseño de la ventana emergente llamada popup.xml (una vista de texto dentro de un despliegue lineal) y lo he agregado en el OnCreate () de mi Actividad principal:

PopupWindow pw = new PopupWindow(findViewById(R.id.popup), 100, 100, true); pw.showAtLocation(findViewById(R.id.main), Gravity.CENTER, 0, 0);

En segundo lugar hice exactamente lo mismo con este código:

final LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.popup, (ViewGroup) findViewById(R.layout.main) ), 100, 100, true); pw.showAtLocation(findViewById(R.id.main_page_layout), Gravity.CENTER, 0, 0);

El primero lanza una NullPointerException y el segundo lanza una BadTokenException y dice "No se puede agregar la ventana: el token null no es válido"

¿Qué diablos estoy haciendo mal? Soy muy novato así que por favor ten paciencia conmigo.


Dependiendo del caso de uso, para los tipos de ventanas emergentes que muestran un mensaje, configurar el tipo de ventana emergente en TYPE_TOAST usando setWindowLayoutType() evita el problema, ya que este tipo de setWindowLayoutType() emergente no depende de la actividad subyacente.

Edición: Uno de los efectos secundarios: no hay interacción en la ventana emergente para API <= 18, ya que el sistema eliminará los eventos táctiles / enfocados. ( http://www.jianshu.com/p/634cd056b90c )

Terminé usando TYPE_PHONE (ya que la aplicación tiene el permiso SYSTEM_ALERT_WINDOW, de lo contrario tampoco funcionará).


Encontré que la respuesta aceptada no funcionó para mí. Todavía recibí el error del token erróneo ... Así que acabo de llamar al runnable desde un Handler con demora como tal ...

new Handler().postDelayed(new Runnable() { public void run() { showPopup(); } }, 100);



La solución es configurar el modo de giro en el diálogo como se muestra a continuación:

android:spinnerMode="dialog"

o

Spinner(Context context, int mode) tnxs RamallahDroid

Mira esto.


La solución provista por Kordzik no funcionará si lanza 2 actividades consecutivamente:

startActivity(ActivityWithPopup.class); startActivity(ActivityThatShouldBeAboveTheActivivtyWithPopup.class);

Si agrega la ventana emergente de esa manera en un caso como este, obtendrá el mismo bloqueo porque ActivityWithPopup no se adjuntará a Windows en este caso.

Más solusión universal es onAttachedToWindow y onDetachedFromWindow .

Y tampoco hay necesidad de postDelayed (Runnable, 100). Porque este 100 milis no garantiza nada.

@Override public void onAttachedToWindow() { super.onAttachedToWindow(); Log.d(TAG, "onAttachedToWindow"); showPopup(); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); Log.d(TAG, "onDetachedFromWindow"); popup.dismiss(); }


Para evitar la excepción BadTokenException, debe aplazar la visualización de la ventana emergente hasta que se hayan llamado todos los métodos del ciclo de vida (se muestra la ventana de actividad):

findViewById(R.id.main_page_layout).post(new Runnable() { public void run() { pw.showAtLocation(findViewById(R.id.main_page_layout), Gravity.CENTER, 0, 0); } });


Puede comprobar el rootview si tiene el token. Puede obtener el diseño principal definido a partir de su xml de actividad, mRootView

if (mRootView != null && mRootView.getWindowToken() != null) { popupWindow.showAtLocation(); }


Puede especificar el desplazamiento de y para tener en cuenta la barra de estado desde el método pw.showAtLocation ...


Si muestra un PopupWindow en otro PopupWindow, no use la vista en el primer POP, use la vista principal de origen.

pop.showAtLocation(parentView, ... );


También puedes intentar usar este cheque:

public void showPopupProgress (){ new Handler().post(new Runnable() { @Override public void run() { if (getWindow().getDecorView().getWindowVisibility() == View.GONE) { showPopupProgress(); return; } popup.showAtLocation(.....); } }); }


Tuve el mismo problema (BadTokenException) con AlertDialog en dialog.show() . Estaba haciendo un AlertDialog siguiendo un ejemplo. En mi caso, la razón de ese problema fue una cadena dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST)

Todo empezó a funcionar después de que lo quité.


uso de la clase Contexto por ejemplo. MainActivity.this en lugar de getApplicationContext ()