【发布时间】:2014-01-09 18:25:47
【问题描述】:
是否有一种巧妙的方法可以在用户每次点击或点击屏幕时“做某事”?我想知道他们点击了哪个视图,并且不必用自定义视图替换我所有的标准视图。
基本上,我想在我的应用中添加点击跟踪以帮助进行分析。我们已经有了页面跟踪(通过为每个活动使用共享超类),但在某些情况下页面跟踪还不够,我们实际上想要跟踪点击。
如何在用户每次点击屏幕上的视图时执行一个函数?
【问题讨论】:
是否有一种巧妙的方法可以在用户每次点击或点击屏幕时“做某事”?我想知道他们点击了哪个视图,并且不必用自定义视图替换我所有的标准视图。
基本上,我想在我的应用中添加点击跟踪以帮助进行分析。我们已经有了页面跟踪(通过为每个活动使用共享超类),但在某些情况下页面跟踪还不够,我们实际上想要跟踪点击。
如何在用户每次点击屏幕上的视图时执行一个函数?
【问题讨论】:
在您的每个活动中,只需在onCreate 的末尾添加这个(如果您的所有活动都是自定义活动的子类,这尤其容易,因为您只需要编写一次):
getWindow().getDecorView().findViewById(android.R.id.content).setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent e) {
//handle your code here
return false;//don't absorb the touch.
}
});
编辑
上面的代码不容易识别出哪个Views 被触摸了。下面的代码将。请注意,如果有问题的View 已经注册了onTouch 事件,这可能会破坏其他onTouchListeners。如果没有,这将非常有效。它使用droidQuery 库来选择层次结构中的所有视图,并使用上面的代码来处理触摸而不吸收事件。最好的地方是在onCreate 的末尾,在每个Activity:
首先,选择您想要的架构的最高级别。如果你的布局的根视图有一个 id,那将是最好的:
$.with(this, R.id.root_id)
如果没有,请添加一个,或选择最顶层的视图(在您的布局上方)。请注意,对于分析,这可能会提供一些您不需要的结果:
$.with(this).selectAll()
现在,在此选择的末尾,附加以下内容:
.each(new Function() {
@Override
public void invoke($ d, Object... args) {
d.view(0).setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent e) {
//do something with the clicked view, such as:
handleTouch(v, e);
return false;//don't absorb the touch.
}
})
}
});
然后有一个新方法:
private void handleTouch(View v, MotionEvent e) {
//handle the view touch.
}
【讨论】:
v 始终是内容视图?例如。如果我的活动有一个包含一堆视图项目的列表视图,它会告诉我点击了哪个项目吗?
View 类添加一个方法,用于处理所有视图的触摸)。