4

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

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

4

6 回答 6

3

我希望我理解你的正确。

您可以做的是创建一个扩展 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");
        }
    }

}

不要忘记使用动作注册接收器

于 2012-09-25T07:13:28.013 回答
2

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

然后,您需要让每个布局文件在顶部包含该视图(可能在 FrameLayout 中)。

于 2012-09-25T07:08:47.733 回答
1

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

但是有一个重要的警告,它仅在您的所有活动都属于同一类型的情况下才有效(例如 - 所有活动都是Activitiy类型或所有活动都是类型ListActivity

于 2012-09-25T07:08:14.117 回答
0

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

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 事件

于 2015-02-10T13:07:33.300 回答
0

完全有可能。

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

现在,所有其余的n活动都应该扩展MyTouchActivity而不是常规活动。这样,该代码将被继承到您的所有 n 个活动中。您需要创建 Seperate MyTouchListActivity(用于 ListActivity)和 MyTouchMapActivity(用于 MapActivity)

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

于 2012-09-25T07:09:01.310 回答
0

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

长话短说,我正在为我的高级项目处理这个问题,我开发了一个能够收集应用程序的所有触摸事件的库。该库依赖于棘手的方法,但它也可以工作。该库是开源的。如果需要,您可以检查它: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());
    }
});
于 2020-06-29T16:35:44.570 回答