如何跟踪Android应用程序中的每一次合理点击?

TGa*_*Gar 6 android touch-event android-activity

每次用户点击我的应用程序中的任何可点击视图时,我都需要跟踪一个事件。我一般都想这样做,例如在我的主要活动中。
我知道我可以覆盖onUserInteraction()或者dispatchTouchEvent()但是即使对于不可点击的视图的点击,这些也正在运行。

我不需要在可点击视图之间进行区分,只要它是可点击的就足够了。
在理想情况下,我还会将向上按钮与其他点击区分开来。

这可能吗?

Ana*_*lii 0

问题

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)