2012-04-24 9 views
7

Sto utilizzando un Toast con una visualizzazione personalizzata. Istanzio la vista e chiamo setView sul toast. Il Toast avrebbe dovuto galleggiare sopra e non ricevere gli eventi di messa a fuoco e tocco, e ha funzionato bene. Dopo che l'app è stata lanciata, gli utenti si sono lamentati del fatto che su alcuni modelli di telefono come il Galaxy Note, il Toast ha ricevuto eventi di tocco e l'app sottostante non lo ha fatto.Android Toast ottiene gli eventi di tocco su alcuni telefoni, e non su altri

Ho stampato i flag dei parametri di layout (WindowManager.LayoutParams) che la vista ottiene nel metodo setLayoutParams. Si scopre che sulla maggior parte dei dispositivi, il valore è 0x000098, ma su alcuni è 0x040088. Sui dispositivi che il Toast riceve gli eventi di tocco, viene rimossa la bandiera FLAG_NOT_TOUCHABLE e viene aggiunta la flag FLAG_WATCH_OUTSIDE_TOUCH. Questo spiega perché il toast ottiene gli eventi di tocco.

Ma cosa causa questa differenza? C'è un modo per forzare il brindisi a non essere tangibile?

+0

Hai trovato una risposta? Inoltre, come hai letto i parametri Toast? – theJosh

+0

"toast.getView(). SetEnabled (false);" lavoro per te? Questo dovrebbe disabilitare gli eventi di tocco sulla vista del toast. – domi

+0

Questa domanda ha 2 anni e improvvisamente è tornata in vita. Non ho un dispositivo per testarlo al momento – yoah

risposta

1

Ho un lavoro in giro. È necessario avere accesso alla vista che il pane tostato sta coprendo. Puoi fondamentalmente catturare gli eventi touch che vanno al Toast. Quindi cambia MotionEvent X e Y. Quindi invia MotionEvent alla vista che è oscurata. Mi sembra un po 'hacky, ma funziona. Penserei che sarebbe meglio cambiare le bandiere sul Toast ma non riesco a trovarle.

Nel l'attività crea la tostatura:

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; 
       } 
      }); 

Se qualcuno ha un modo migliore mi piacerebbe qui esso.

+0

Per il mio caso questo non è buono in quanto la vista qui sotto è di un'altra app. Potresti provare a visualizzare il brindisi, trovare la finestra e cambiare le bandiere di Windows. Non sono sicuro che questi flag possano essere modificati – yoah

+0

Google utilizza una visualizzazione personalizzata al posto di un normale toast per aggiungere il pulsante "annulla" in Gmail. Dai un'occhiata a [questa domanda SO] (http://stackoverflow.com/questions/9575520/how-can-i-include-a-button-in-a-toast-notification) per maggiori informazioni. – sonictt1

Problemi correlati