12

如何获得View我的应用程序的“顶部”(包含Activity和所有DialogFragments)?我需要拦截所有触摸事件来处理一些View介于DialogFragment和 my之间的运动Activity

我试图通过 Activity 的装饰视图来捕捉它们(事件),但Window没有运气:

getWindow().getDecorView().setOnTouchListener(...);
4

2 回答 2

23

您可以重写Activity.dispatchTouchEvent以拦截 Activity 中的所有触摸事件,即使您有一些会消耗触摸事件的视图(如 ScrollView、Button 等)。

结合ViewGroup.requestDisallowInterceptTouchEvent,可以禁用 ViewGroup 的触摸事件。例如,如果您想禁用某个 ViewGroup 中的所有触摸事件,请尝试以下操作:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    requestDisallowInterceptTouchEvent(
            (ViewGroup) findViewById(R.id.topLevelRelativeLayout),
            true
    );
    return super.dispatchTouchEvent(event);
}

private void requestDisallowInterceptTouchEvent(ViewGroup v, boolean disallowIntercept) {
    v.requestDisallowInterceptTouchEvent(disallowIntercept);
    int childCount = v.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = v.getChildAt(i);
        if (child instanceof ViewGroup) {
            requestDisallowInterceptTouchEvent((ViewGroup) child, disallowIntercept);
        }
    }
}
于 2015-06-04T12:01:02.770 回答
0

如果您想知道如何拦截 中的所有触摸事件DialogFragments,请执行以下操作:

abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return object : Dialog(requireContext()){
            override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
                // do your thing here
                return super.dispatchTouchEvent(ev)
            }
        }
    }

}
于 2021-05-21T10:06:56.607 回答