TGa*_*Gar 6 android touch-event android-activity
每次用户点击我的应用程序中的任何可点击视图时,我都需要跟踪一个事件。我一般都想这样做,例如在我的主要活动中。
我知道我可以覆盖onUserInteraction()或者dispatchTouchEvent()但是即使对于不可点击的视图的点击,这些也正在运行。
我不需要在可点击视图之间进行区分,只要它是可点击的就足够了。
在理想情况下,我还会将向上按钮与其他点击区分开来。
这可能吗?
View跟踪应用程序中任何可点击项上发生的任何点击。
这个解决方案有点繁重,需要您遵守一定的纪律(setOnClickListener()除了跟踪点击之外,不要用于其他目的)。
将 a 添加到您的 base 中的View.OnClickListenerany或 any中,您想要跟踪其点击事件。仅当全局布局完成加载(通过添加)到根视图时才开始执行此操作。因此,代码如下所示:ViewActivityActivityOnGlobalLayoutListener
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
...
View decorView = getWindow().getDecorView();
decorView.getViewTreeObserver().addOnGlobalLayoutListener(() ->
printClickedViews(getWindow().getDecorView())
);
}
private void printClickedViews(View currentView) {
if (currentView == null) {
return;
}
currentView.setOnClickListener(v -> {
Toast.makeText(v.getContext(), "Clicked on " + v.getClass().getSimpleName(),
Toast.LENGTH_LONG).show();
});
if (currentView instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) currentView;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
printClickedViews(viewGroup.getChildAt(i));
}
}
}
...
Run Code Online (Sandbox Code Playgroud)
请注意,即使您添加/删除新的View,您OnGlobalLayoutListener也会收到通知,这很好。
最明显的限制是设置 a View.OnClickListenerwill 必须仅用于跟踪点击。但是,您始终可以用于OnTouchListener相同目的,如下所示:
view.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_UP) {
// handle your click event here
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |