Desactivación de ventana emergente de Android

Tengo una ventana emergente que exhibe cuando hago clic en un artículo en mi actividad de la lista. El problema es que la tecla de retroceso no lo cierra. Intenté coger la tecla de la parte posterior en mi actividad de la lista pero no la registra … entonces intenté registrar un onkeylistener a la visión que estoy pasando a mi ventana emergente. Me gusta esto:

pop.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub boolean res=false; if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // do something on back. Log.e("keydown","back"); if (pw.isShowing()) { Log.e("keydown","pw showing"); pw.dismiss(); res = true; } } else { res = false; } return res; } }); 

Que se pasa a un popup como este:

 pw = new PopupWindow( pop, 240, 70, true); 

Pero ese oyente no dispara ni. ¿Me puedes ayudar? Estoy sin ideas

Esto se debe a que la ventana emergente no responde a eventos onTouch o onKey a menos que tenga un fondo que! = Null. Echa un vistazo a algún código que escribí para ayudar con esto. En el caso básico puede llamar a PopupWindow#setBackgroundDrawable(new BitmapDrawable()) para forzarlo a actuar de la manera que usted espera. No necesitará su propio oyente onKey. También es posible que deba llamar a PopupWindow#setOutsideTouchable(true) si desea que desaparezca cuando el usuario haga clic fuera de los límites de la ventana.

Respuesta esotérica extendida:

La razón por la cual el fondo no puede ser nulo es debido a lo que ocurre en PopupWindow#preparePopup . Si detecta background != null PopupViewContainer , crea una instancia de PopupViewContainer y llama a setBackgroundDrawable y pone su vista de contenido en ella. PopupViewContainer es básicamente un FrameLayout que escucha los eventos táctiles y el evento KeyEvent.KEYCODE_BACK para descartar la ventana. Si background == null, no hace nada de eso y sólo usa su vista de contenido. Puede, como alternativa a depender de PopupWindow para manejar eso, extienda su ViewGroup raíz para comportarse de la manera que desea.

Hacer según lo siguiente funciona bien:

 PopupWindow pw; LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.weight_popup, (ViewGroup)findViewById(R.id.linlay_weight_popup)); pw = new PopupWindow(layout,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT, true); pw.setBackgroundDrawable(new BitmapDrawable()); pw.setOutsideTouchable(true); pw.showAsDropDown(btnSelectWeight); 

Una solución realmente sencilla es escribir pw.setFocusable (true), pero probablemente no quiera hacer esto porque entonces MapActivity no manejará eventos touch.

Una solución mejor es anular la tecla de retroceso, por ejemplo, como esto:

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Override back button if (keyCode == KeyEvent.KEYCODE_BACK) { if (pw.isShowing()) { pw.dismiss(); return false; } } return super.onKeyDown(keyCode, event); } 

¡Buena suerte!

Para nuevos proyectos es mejor usar

 popupWindow.setBackgroundDrawable(new ColorDrawable()); 

en lugar de

 popupWindow.setBackgroundDrawable(new BitmapDrawable()); 

Como BitmapDrawable está obsoleto. Además, es mejor que ShapeDrawable en este caso. Me di cuenta de que cuando PopupWindow es un rectángulo con esquinas redondeadas, ShapeDrawable llena esquinas con negro.

Solo usa esto

 mPopupWindow.setBackgroundDrawable(new BitmapDrawable(null,"")); 

Que no está obsoleto. Me gustaría evitar nuevo ShapeDrawable () como va a hacer lentamente, ya que trata de dibujar una forma cuando la pantalla tiene que ser redibujado.

Espero que esto sea de ayuda para usted

  pw.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN) { pw.dismiss(); } return true; } }); 

Para los nuevos buscadores , como la creación de un new BitmapDrawable no está permitido ahora ( The constructor BitmapDrawable() is deprecated ), por lo que tiene que cambiarlo a un new ShapeDrawable() , para que cambie:

 pw.setBackgroundDrawable(new BitmapDrawable()); 

A :

 pw.setBackgroundDrawable(new ShapeDrawable()); 

Y toda la obra será como:

 PopupWindow pw; LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.weight_popup, (ViewGroup)findViewById(R.id.linlay_weight_popup)); pw = new PopupWindow(layout,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, true); pw.setOutsideTouchable(true); pw.setBackgroundDrawable(new ShapeDrawable()); pw.setTouchInterceptor(new OnTouchListener() { // or whatever you want @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_OUTSIDE) // here I want to close the pw when clicking outside it but at all this is just an example of how it works and you can implement the onTouch() or the onKey() you want { pw.dismiss(); return true; } return false; } }); pw.showAtLocation(layout, Gravity.CENTER, 0, 0); 

Usted necesita agregar setBackgroundDrawable(new BitmapDrawable()) para su PopupWindow .

  private void initPopupWindow() { // TODO Auto-generated method stub View view = getLayoutInflater().inflate(R.layout.main_choice, null); ListView main_menu_listview = (ListView) view.findViewById(R.id.main_menu_listview); ShowMainChoice madapter = new ShowMainChoice(context); main_menu_listview.setAdapter(madapter); int width = (int)getWindowManager().getDefaultDisplay().getWidth()/2; popupWindow = new PopupWindow(view, width,WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setBackgroundDrawable(new BitmapDrawable());//this is important,如果缺少这句将导致其他任何控件及监听都得不到响应popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); main_menu_listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { // TODO Auto-generated method stub Log.e("++++++>", arg2+""); } }); } 

Este problema es popupwindow 底层 的 消息 机制 决定 的, 因为 它 是 阻塞 式 的. Buena suerte

  • Cambiar el color de fondo cuando se muestra una ventana emergente
  • Agregar programaticamente efecto de animación a un popupWindow (agregado por programa) en android
  • Android PopupWindow con la flecha de herramientas
  • ¿Cómo mostrar el teclado en PopupWindow?
  • ¿Cómo hacer una simple ventana emergente de Android?
  • ¿Cómo mostrar el PopupWindow siempre encima del botón (vista)?
  • Android PopupWindow se oculta detrás de los botones de navegación en Nexus 5
  • Reproductor de vídeo flotante (como el reproductor de youtube) en android
  • Ventana emergente de Android descarta al hacer clic fuera
  • Android Nougat PopupWindow showAsDropDown (...) La gravedad no funciona
  • Quiero establecer el ancho de popup en tiempo de ejecución de acuerdo al tamaño del título en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.