我需要截取DialogFragment
的触摸事件,所以我像这样覆盖了它的视图的父级onInterceptTouchEvent
:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup viewGroup = new FrameLayout(GlobalState.getContext()){
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
mDecorView.onTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
}
};
View view = inflater.inflate(R.layout.enter_number_dialog_layout,container);
viewGroup.addView(view);
return viewGroup;
}
如您所见,只要触摸片段,我就会调用mDecorView.onTouchEvent
。然而,问题是,即使我知道在触摸片段的布局时总是调用interceptOnTouchEvent
- 在mDecorView.onTouchEvent
行上放置一个断点 - mDecorView
的{{1} }仅在触摸OnTouchListener.onTouch
时执行,而不是在TextView
内的任何内容时执行;这是唯一的两个直接孩子。我知道这是因为我在GridLayout
的实现中的第一行代码上放置了一个断点,并且在触摸onTouch
时总是调用它,而不是在TextView
时调用。 / p>
这是我片段的布局:
GridLayout
在触及 <TextView
android:id="@+id/number_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:hint="$"
android:singleLine="true"
android:textSize="40sp"/>
<GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnCount="3"
android:orientation="horizontal">
<Button
android:id="@+id/the_1_button"
android:background="@android:color/white"
android:text="1"/>
<Button
android:id="@+id/the_2_button"
android:background="@android:color/white"
android:text="2"/>
<Button
android:id="@+id/the_3_button"
android:background="@android:color/white"
android:text="3"/>
<Button
android:id="@+id/the_4_button"
android:background="@android:color/white"
android:text="4"/>
<Button
android:id="@+id/the_5_button"
android:background="@android:color/white"
android:text="5"/>
<Button
android:id="@+id/the_6_button"
android:background="@android:color/white"
android:text="6"/>
<Button
android:id="@+id/the_7_button"
android:background="@android:color/white"
android:text="7"/>
<Button
android:id="@+id/the_8_button"
android:background="@android:color/white"
android:text="8"/>
<Button
android:id="@+id/the_9_button"
android:background="@android:color/white"
android:text="9"/>
<ImageButton
android:id="@+id/the_backspace_button"
style="@style/Widget.AppCompat.Button"
android:background="@android:color/white"
android:src="@drawable/ic_backspace"/>
<Button
android:id="@+id/the_0_button"
android:background="@android:color/white"
android:text="0"/>
<Button
android:id="@+id/the_done_button"
android:background="@android:color/white"
android:text="done"/>
</GridLayout>
</LinearLayout>
时,不知道为什么mDecorView
的{{1}}未被调用?
以下是OnTouchListener.onTouch
的{{1}} GridLayout
mDecorView
的正文:
OnTouchListener
答案 0 :(得分:0)
回调方法旨在由事件处理系统调用,而不是由您自己的代码调用。当事件共享功能时,最好将公共代码放在可由任何回调方法调用的方法中。这比直接调用回调更好,因为你有更多的控制权。您确切知道该方法何时执行,并且您只能接受对手头任务有意义的参数。