2012-04-24 7 views
7

Estoy usando un Toast con una vista personalizada. Instalo la vista y llamo a setView en la tostada. Se suponía que Toast flotaba en la parte superior y no recibía eventos de enfoque y contacto, y funcionó bien. Después de que se lanzó la aplicación, los usuarios se quejaron de que en algunos modelos de teléfono como el Galaxy Note, el Toast obtenía eventos táctiles y la aplicación que se encontraba debajo no.Android Toasts recibe eventos táctiles en algún teléfono, y no en otros

Imprimí los indicadores de parámetros de diseño (WindowManager.LayoutParams) que la vista obtiene en el método setLayoutParams. Resulta que en la mayoría de los dispositivos, el valor es 0x000098, pero en algunos casos es 0x040088. En los dispositivos que Toast recibe los eventos táctiles, se quita el indicador FLAG_NOT_TOUCHABLE y se agrega el indicador FLAG_WATCH_OUTSIDE_TOUCH. Esto explica por qué la tostada recibe los eventos táctiles.

¿Pero qué causa esta diferencia? ¿Hay alguna manera de forzar que la tostada no sea tangible?

+0

¿Encontró una respuesta? Además, ¿cómo leíste los parámetros Toast? – theJosh

+0

Es "toast.getView(). SetEnabled (false);" trabajando para ti? Eso debería deshabilitar los eventos táctiles en la vista de los brindis. – domi

+0

Esta pregunta tiene 2 años y de repente volvió a la vida. No tengo un dispositivo para probar esto en el momento – yoah

Respuesta

1

Tengo un trabajo alrededor. Debe tener acceso a la vista que cubre la tostada. Básicamente puedes capturar eventos táctiles yendo al Toast. A continuación, cambie MotionEvent X e Y. A continuación, envíe el MotionEvent a la vista que está oscurecida. Me parece un poco raro, pero funciona. Creo que sería mejor cambiar las banderas en el Toast, pero no puedo encontrarlas.

En la actividad crea la tostada:

final Taost toast = Toast.makeText(this, "Text", Toast.LENGTH_LONG); 
final View myCoveredView = findViewById(R.id.my_covered_view); 
final View toastView = toast.getView(); 

toastView.setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(final View v2, final MotionEvent event) { 
        //Make sure the view is accessible 
        if(myCoveredView != null){ 
         //Set the touch location to the absolute screen location 
         event.setLocation(event.getRawX(), event.getRawY()); 
         //Send the touch event to the view 
         return myCoveredView.onTouchEvent(event); 
        } 
        return false; 
       } 
      }); 

Si alguien tiene una mejor manera Me encantaría aquí.

+0

Para mi caso, esto no es bueno ya que la vista a continuación es de otra aplicación. Podría tratar de obtener la vista de la tostada, buscar la ventana y cambiar los indicadores de Windows. No estoy seguro de si se pueden cambiar estos indicadores – yoah

+0

Google usa una vista personalizada en lugar de un brindis normal para agregar el botón "deshacer" en Gmail. Consulte [esta pregunta SO] (http://stackoverflow.com/questions/9575520/how-can-i-include-a-button-in-a-toast-notification) para obtener más información. – sonictt1

Cuestiones relacionadas