2012-04-24 65 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