2012-04-24 10 views
7

私はカスタムビューでトーストを使用しています。私はビューをインスタンス化し、トーストでsetViewを呼び出します。 トーストは一番上に浮いていてフォーカスとタッチのイベントを受けていないと思われ、うまくいきました。アプリが起動された後、ユーザーはGalaxy Noteのようないくつかの携帯電話モデルで、Toastはタッチイベントを受け取り、その下のアプリはそれをしなかったと訴えた。Androidトーストは一部の電話機でタッチイベントを取得します。

ビューがメソッドsetLayoutParamsで取得するレイアウトパラメータフラグ(WindowManager.LayoutParams)を表示しました。ほとんどのデバイスでは、値は0x000098ですが、0x040088であることが判明しています。 Toastがタッチイベントを取得するデバイスでは、フラグFLAG_NOT_TOUCHABLEが削除され、フラグFLAG_WATCH_OUTSIDE_TOUCHが追加されます。これは、トーストがタッチイベントを取得する理由を説明します。

しかし、この違いは何ですか?トーストに触れないように強制する方法はありますか?

+0

答えを見つけましたか?また、どのようにトーストのパラメータを読んだのですか? – theJosh

+0

"toast.getView()。setEnabled(false);"あなたのために働く?これは、トーストのビューでタッチイベントを無効にする必要があります。 – domi

+0

この質問は2歳で突然、人生に戻った。私は現時点でこれをテストするデバイスを持っていません – yoah

答えて

1

私は回避策があります。トーストがカバーしているビューにアクセスする必要があります。基本的にトーストに行くタッチイベントをキャプチャすることができます。次に、MotionEvent XとYを変更します。次に、モーションイベントを不明瞭なビューに送信します。それは私に少しハッキリと感じますが、それは動作します。トーストの旗を変えるほうがいいと思うが、見つけられない。活動で

インクルードはトーストを作成します。

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

+0

Gmailは「元に戻す」ボタンを追加するために、通常のトーストの代わりにカスタムビューを使用します。詳細は[このSOの質問](http://stackoverflow.com/questions/9575520/how-can-i-include-a-button-in-a-toast-notification)をご覧ください。 – sonictt1

関連する問題