Android Toast 在某些手机上获取触摸事件,而不是在其他手机上



我正在使用带有自定义视图的 Toast。我实例化视图并在吐司上调用 setView。吐司应该漂浮在顶部,不接收焦点和触摸事件,效果很好。该应用程序启动后,用户抱怨说,在Galaxy Note等少数手机型号上,Toast确实获得了触摸事件,而它下面的应用程序则没有。

我打印了视图在方法setLayoutParams中获得的布局参数标志(WindowManager.LayoutParams)。事实证明,在大多数设备上,该值是0x000098,但在某些设备上是0x040088。在 Toast 获取触摸事件的设备上,将删除标志FLAG_NOT_TOUCHABLE,并添加标志FLAG_WATCH_OUTSIDE_TOUCH。这就解释了为什么吐司会获得触摸事件。

但是是什么导致了这种差异呢?有没有办法强迫吐司不可触摸?

我有一个解决方法。您需要有权访问吐司所覆盖的视图。您基本上可以捕获转到 Toast 的触摸事件。然后更改运动事件 X 和 Y。然后将 MotionEvent 发送到被遮挡的视图。这对我来说感觉有点笨拙,但它有效。我认为最好更改吐司上的标志,但我找不到它们。

在活动中创建 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;
                }
            });

如果有人有更好的方法,我会喜欢在这里。

相关内容

最新更新