我正在开发一款新应用程序,我有一个疑问是否可能实现以下功能:
我们需要为整个应用程序设置一次监听器,并且当应用程序中的任何触摸事件发生时运行一组代码。 例如,我们的应用程序中可能会有n个活动,但我们需要为所有活动设置一次监听器,并在任何n个活动中发生触摸事件时运行一组代码。 我已经尝试了很多方法,欢迎任何想法。 提前致谢。
我正在开发一款新应用程序,我有一个疑问是否可能实现以下功能:
我们需要为整个应用程序设置一次监听器,并且当应用程序中的任何触摸事件发生时运行一组代码。 例如,我们的应用程序中可能会有n个活动,但我们需要为所有活动设置一次监听器,并在任何n个活动中发生触摸事件时运行一组代码。 我已经尝试了很多方法,欢迎任何想法。 提前致谢。
我希望我理解得没错。
你可以创建一个扩展了Activity的类,比如叫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);
}
}
现在在您的全局广播接收器中,您将收到该广播。
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");
}
}
}
```
- Md. Masum Billahpublic boolean dispatchTouchEvent (MotionEvent ev)
方法。这个重写的实现将是所有触摸事件落脚的唯一位置。Activitiy
类型或者都是ListActivity
类型)。public class MyCustomActivity extends ActionBarActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout decorView = (FrameLayout) getActivity().getWindow().getDecorView();
decorView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "Click X:" + event.getX() + " Y:" + event.getY());
return false;
}
});
}
}
然后从MyCustomActivity扩展所有其他活动:
public class MainActivity extends MyCustomActivity{ }
然后所有的触摸事件都将通过您的TouchListener事件处理
完全可以。
创建一个名为MyTouchActivity
(或其他名称)的活动,覆盖onTouch
事件并编写你所说的set
代码。
现在,所有其余的n
个活动应该扩展MyTouchActivity
而不是常规活动。这样,该代码将继承到您的所有n个活动中。您需要创建单独的MyTouchListActivity
(用于ListActivity)和MyTouchMapActivity
(用于MapActivity)。
另一种方法是简单地创建一个Ontouch监听器,然后覆盖每个活动中的onTocuh
事件以首先调用您的监听器。但那很麻烦。
onTouch
中,你返回了false吗?如果你返回true,触摸事件将不会传递到组件(例如按钮等),请确保你返回false或者super.onTouch()
。 - st0le使用dispatchTouchEvent
或onTouch
方法的解决方案并不适用于整个应用程序。因为有不同类型的窗口。例如,如果弹出一个片段或用户点击菜单,则这些解决方案将无法捕获触摸事件,因为在这些情况下会发生其他事情。
长话短说,我在处理我的毕业项目时遇到了这个问题,并开发了一个库,能够收集应用程序的所有触摸事件。该库依赖于一些巧妙的方式,但它确实有效。该库是开源的。如果您想要查看它,请访问:https://github.com/fatih-iver/touchy
只需将其添加为依赖项:
implementation 'fun.observe:touchy:1.0.0'
然后,通过注册您的接收器来使用它:
MotionEventBroadcaster.registerReceiver(new MotionEventReceiver() {
@Override
protected void onReceive(MotionEvent motionEvent) {
Log.d(TAG, motionEvent.toString());
}
});