如何获得View
我的应用程序的“顶部”(包含Activity
和所有DialogFragment
s)?我需要拦截所有触摸事件来处理一些View
介于DialogFragment
和 my之间的运动Activity
。
我试图通过 Activity 的装饰视图来捕捉它们(事件),但Window
没有运气:
getWindow().getDecorView().setOnTouchListener(...);
如何获得View
我的应用程序的“顶部”(包含Activity
和所有DialogFragment
s)?我需要拦截所有触摸事件来处理一些View
介于DialogFragment
和 my之间的运动Activity
。
我试图通过 Activity 的装饰视图来捕捉它们(事件),但Window
没有运气:
getWindow().getDecorView().setOnTouchListener(...);
您可以重写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);
}
}
}
如果您想知道如何拦截 中的所有触摸事件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)
}
}
}
}