整个android应用程序的触摸事件

整个android应用程序的触摸事件,android,Android,我正在开发一个新的应用程序,在这个应用程序中,我非常怀疑这是否可能? 我的怀疑是 我们必须为整个应用程序设置一个时间侦听器。我们必须为应用程序中发生的任何触摸事件运行一组代码例如我们的应用程序中可能有n个活动。但我们必须为所有活动设置一个时间侦听器,并在n个活动中的任何一个发生任何接触时运行一组代码。我为此做了很多尝试。欢迎提出任何意见。提前感谢。您可以做的是创建一个基本活动类,该类由应用程序中的所有其他活动扩展。然后,您可以覆盖此基本活动中的公共布尔dispatchTouchEvent(Mot

我正在开发一个新的应用程序,在这个应用程序中,我非常怀疑这是否可能? 我的怀疑是


我们必须为整个应用程序设置一个时间侦听器。我们必须为应用程序中发生的任何触摸事件运行一组代码例如我们的应用程序中可能有n个活动。但我们必须为所有活动设置一个时间侦听器,并在n个活动中的任何一个发生任何接触时运行一组代码。我为此做了很多尝试。欢迎提出任何意见。提前感谢。

您可以做的是创建一个基本活动类,该类由应用程序中的所有其他活动扩展。然后,您可以覆盖此基本活动中的
公共布尔dispatchTouchEvent(MotionEvent ev)
方法。这个被覆盖的实现将是所有触摸事件的唯一登陆点


不过有一个重要的警告,只有当您的所有活动都属于同一类型时(例如,所有活动都属于
activity
类型,或者所有活动都属于
ListActivity

您可以创建一个不可见的自定义视图,获取所有屏幕并使用onTouchEvent执行您需要执行的任何操作

然后,您需要将每个布局文件都包含在顶部(可能在框架布局中)。

完全可能

创建一个名为
MyTouchActivity
(或其他)的活动,覆盖
onTouch
事件,并编写您正在谈论的
集合
代码

现在,所有剩余的
n
活动应该扩展
MyTouchActivity
,而不是常规活动。这样,代码就被继承到所有的n活动中。您需要分别创建
MyTouchListActivity
(对于ListActivity)和MyTouchMapActivity(对于MapActivity)


另一种方法是简单地创建一个Ontouch侦听器,然后覆盖每个活动中的每个
onTocuh
事件,首先调用您的侦听器。但那太麻烦了。

我希望我对你的理解是正确的

您可以做的是创建一个扩展活动的类,比如说TouchActivity。 您的每个活动都将继承TouchActivity

 public class TouchActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            Log.d("Touch", "Touch");
            sendBroadcast(new Intent("touch_event_has_occured"));
        }

        return super.onTouchEvent(event);
    }
}
现在,在您的全球广播接收器中,您将获得brodcast

public class TouchReveiver extends BroadcastReceiver 
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        if (intent.getAction().equals("touch_event_has_occured"))
        {
            Log.d("Touch", "Touch");
        }
    }

}

别忘了用action注册接收者

如果你不想在整个应用程序中使用它,你需要创建从ActionBarActivity(或SherlockActivity)扩展的类

然后从MyCustomActivity扩展所有其他活动:

public class MainActivity extends MyCustomActivity{ }

所有触摸事件都将通过您的TouchListener事件

使用
dispatchTouchEvent
onTouch
方法的解决方案不适用于整个应用程序。因为有不同类型的窗口。例如,如果弹出一个片段或用户单击菜单,这些解决方案将无法捕获触摸事件,因为在这些情况下,其他事情正在发生

长话短说,我在我的高级项目中处理这个问题,我开发了一个库,可以收集应用程序的所有触摸事件。图书馆依赖于巧妙的方法,但它也能工作。这个图书馆是开源的。如果需要,您可以检查:

只需将其添加为依赖项:

implementation 'fun.observe:touchy:1.0.0'
然后,通过注册接收者来使用它:

MotionEventBroadcaster.registerReceiver(new MotionEventReceiver() {
    @Override
    protected void onReceive(MotionEvent motionEvent) {
        Log.d(TAG, motionEvent.toString());
    }
});

“接收广播”是什么意思?接收到哪里?更改了我的问题,您现在能理解吗?它正在工作,但是如果我在任何活动中添加一个按钮,并且如果我单击该按钮表示,ontouch事件不工作@斯里尼瓦斯,对不起,你能说得更具体一点吗?按钮是否不响应单击?你注册了一个听众吗?在
onTouch
中,是否返回false?如果返回true,则触摸事件不会传递给组件(例如按钮等)。请确保返回false或
super.onTouch()
。当我在ontouchevent()中打印日志时,它会在触摸到空屏幕时打印该日志,但当我在同一屏幕上单击按钮时,它不会打印。@Srinivas,啊,我想情况正好相反,触摸事件首先提供给组件,然后提供给活动。现在按钮上方有一个触控按钮,所以当你点击它时,它不会在活动中弹出该事件。我认为您必须创建一个全局OnTouchListener,并为您要拦截的每个组件设置它。如何使用此操作注册接收器?我是这样做的:“你的答案是唯一一个为我工作的人,谢谢!
MotionEventBroadcaster.registerReceiver(new MotionEventReceiver() {
    @Override
    protected void onReceive(MotionEvent motionEvent) {
        Log.d(TAG, motionEvent.toString());
    }
});