如何禁用View的所有子元素以捕获鼠标触摸事件

时间:2013-01-06 10:52:23

标签: java android android-layout

我正在尝试Android中的水平滑块菜单(如Facebook)。

我只希望我的容器View能够捕获鼠标触摸事件。

我已尝试setEnable(false)容器视图的所有子元素。但它导致视图不捕获触摸事件。

public void ChangeMenuVisibility() {
        int menuWidth = menu.getMeasuredWidth();
        // Ensure menu is visible
        menu.setVisibility(View.VISIBLE);
        int left = !menuOut ? 0 : menuWidth;
        container.smoothScrollTo(left, 0);
        menuOut = !menuOut;
        ViewUtils.enableDisableViewGroup(
                (ViewGroup) window.findViewById(R.id.main_content), !menuOut);
        window.findViewById(R.id.main_content).setEnabled(true);
    }
[ViewUtils.java]
    public static void enableDisableViewGroup(ViewGroup viewGroup,
            boolean enabled) {
        int childCount = viewGroup.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = viewGroup.getChildAt(i);
            view.setEnabled(enabled);
            if (view instanceof ViewGroup) {
                enableDisableViewGroup((ViewGroup) view, enabled);
            }
        }
    }

我应该采取什么策略来实现这一目标。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

覆盖View.onInterceptTouchEvent()中的ViewGroup,请勿调用super.onInterceptTouchEvent()并返回true。这会导致触摸事件不会传递到层次结构中(传递给ViewGroup的子项)。

答案 1 :(得分:0)

我已经解决了这个问题@ nmw答案的灵感。

您应该扩展您的View组(我更喜欢使用LinearLayout)。

对于子元素忽略鼠标触摸事件。您必须实施onInterceptTouchEvent方法。

这是解决此问题的示例布局:

import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.LinearLayout;

public class MyLinearLayout extends LinearLayout {

    public MyLinearLayout(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    boolean mChildCanCaptureTouchEvent = true;

    /**
     * @return the mChildCanCaptureTouchEvent
     */
    public boolean ChildCanCaptureTouchEvent() {
        return mChildCanCaptureTouchEvent;
    }

    /**
     * @param mChildCanCaptureTouchEvent
     *            the mChildCanCaptureTouchEvent to set
     */
    public void ChildCanCaptureTouchEvent(boolean mChildCanCaptureTouchEvent) {
        this.mChildCanCaptureTouchEvent = mChildCanCaptureTouchEvent;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getAction() != MotionEvent.ACTION_MOVE) {
            return true;
        }

        if (!mChildCanCaptureTouchEvent)
            return true;

        return super.onInterceptTouchEvent(ev);
    }
}