2012-04-24 9 views
7

Używam Toast z niestandardowym widoku. Inicjuję widok i wywołuję setView na toście. Toast miał unosić się na górze i nie otrzymywać informacji o fakcie i dotykać zdarzeń, i to działało dobrze. Po uruchomieniu aplikacji użytkownicy skarżyli się, że w kilku modelach telefonów, takich jak Galaxy Note, toast dostał zdarzenia dotykowe, a aplikacja pod nim nie działała.Android Toasts uzyskać zdarzeń dotykowych na niektórych telefonach, a nie na innych

Wydrukowałem flagi parametrów układu (WindowManager.LayoutParams), które widok dostaje w metodzie setLayoutParams. Okazuje się, że na większości urządzeń wartość wynosi 0x000098, ale na niektórych jest to 0x040088. Na urządzeniach, w których Toast dostaje zdarzenia dotykowe, flaga FLAG_NOT_TOUCHABLE jest usuwana, a flaga FLAG_WATCH_OUTSIDE_TOUCH jest dodawana. To tłumaczy, dlaczego toast dostaje wydarzenia dotykowe.

Ale co powoduje tę różnicę? Czy istnieje sposób, aby zmusić toast, by nie był dotykalny?

+0

Czy znalazłeś odpowiedź? Ponadto, w jaki sposób przeczytałeś paragrafy Toast? – theJosh

+0

To "toast.getView(). SetEnabled (false);" pracuje dla ciebie? To powinno wyłączyć wydarzenia dotykowe w widoku tostów. – domi

+0

To pytanie ma 2 lata i nagle wróciło do życia. Nie mam urządzenia do testowania tego w tej chwili – yoah

Odpowiedz

1

Mam pracę. Musisz mieć dostęp do widoku, który pokrywa toast. Możesz w zasadzie uchwycić wydarzenia dotykowe przechodzące do Toast. Następnie zmień MotionEvent X i Y. Następnie wyślij MotionEvent do widoku, który jest zasłonięty. Dla mnie to trochę dziwne, ale działa. Sądzę, że lepiej byłoby zmienić flagi na toście, ale nie mogę ich znaleźć.

W działalnością tworzy Toast:

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

Jeśli ktoś ma lepszy sposób ja chciałbym go tutaj.

+0

W moim przypadku nie jest to dobre, ponieważ widok poniżej przedstawia inną aplikację. Możesz spróbować uzyskać widok toastu, znaleźć okno i zmienić flagi okien. Nie jestem pewien, czy te flagi mogą zostać zmienione. – yoah

+0

Google używa niestandardowego widoku zamiast zwykłego tosty, aby dodać przycisk "cofnij" w Gmailu. Sprawdź [to pytanie SO] (http://stackoverflow.com/questions/9575520/how-can-i-include-a-button-in-a-toast-notification), aby uzyskać więcej informacji. – sonictt1

Powiązane problemy