7

カスタムビューでトーストを使用しています。ビューをインスタンス化し、トーストで setView を呼び出します。Toast は一番上に浮かび、フォーカス イベントやタッチ イベントを受信しないはずでしたが、うまく機能しました。アプリが起動された後、Galaxy Note のようないくつかの電話モデルで、Toast はタッチ イベントを取得し、その下のアプリは取得しなかったとユーザーから苦情が寄せられました。

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

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

4

1 に答える 1

1

回避策があります。トーストがカバーしているビューにアクセスできる必要があります。基本的に、トーストに送られるタッチ イベントをキャプチャできます。次に、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;
                }
            });

誰かがより良い方法を持っているなら、私はそれをここに置きたいです.

于 2015-02-12T17:48:47.133 に答える