2012-04-24 63 views
7

我正在使用帶有自定義視圖的Toast。我實例化視圖並在吐司上調用setView。 Toast應該浮在頂部,不會收到焦點和觸摸事件,並且它運行良好。該應用程序啓動後,用戶抱怨說在像Galaxy Note這樣的手機型號中,Toast確實獲得了觸摸事件,而下面的應用程序沒有。Android敬酒在某些手機上獲取觸摸事件,而在其他手機上獲得觸摸事件

我打印了視圖在方法setLayoutParams中獲取的佈局參數標誌(WindowManager.LayoutParams)。事實證明,在大多數設備上,該值爲0x000098,但在某些設備上爲0x040088。在Toast獲得觸摸事件的設備上,FLAG_NOT_TOUCHABLE標誌被刪除,並添加標誌FLAG_WATCH_OUTSIDE_TOUCH。這解釋了爲什麼吐司會得到觸摸事件。

但是,造成這種差異的原因是什麼?有沒有辦法迫使吐司不可觸摸?

+0

您是否找到答案?另外,你是怎麼讀Toast params的? – theJosh 2015-02-11 00:15:17

+0

是「toast.getView()。setEnabled(false);」爲你工作?這應該在吐司的視圖上禁用觸摸事件。 – domi 2015-02-11 00:30:05

+0

這個問題是2歲,突然恢復生機。我沒有一個設備來測試此刻 – yoah 2015-02-11 08:45:56

回答

1

我有一個工作。您需要訪問吐司覆蓋的視圖。你基本上可以捕捉去Toast的觸摸事件。然後更改MotionEvent X和Y.然後將MotionEvent發送到被遮擋的視圖。對我來說感覺有點不好意思,但它有效。我認爲改變吐司上的標誌會更好,但我找不到它們。

在活動中創建吐司:

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

如果任何人有一個更好的辦法我喜歡這裏吧。

+0

對於我的情況,這是不好的,因爲下面的視圖是另一個應用程序。你可以嘗試獲取吐司的視圖,找到窗口,並更改窗口標誌。我不確定這些標誌是否可能會更改 – yoah 2015-02-12 18:00:09

+0

Google使用自定義視圖來代替普通的吐司,以便在Gmail中添加「撤消」按鈕。看看[這個問題](http://stackoverflow.com/questions/9575520/how-can-i-include-a-button-in-a-toast-notification)瞭解更多信息。 – sonictt1 2015-02-17 20:06:01