仅当被触摸的孩子不可点击时,才会调用查看父母的onTouch方法

时间:2016-09-24 01:36:28

标签: android

我需要截取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

1 个答案:

答案 0 :(得分:0)

回调方法旨在由事件处理系统调用,而不是由您自己的代码调用。当事件共享功能时,最好将公共代码放在可由任何回调方法调用的方法中。这比直接调用回调更好,因为你有更多的控制权。您确切知道该方法何时执行,并且您只能接受对手头任务有意义的参数。