滑动抽屉上的按钮? - Android

时间:2011-01-17 09:52:25

标签: android

Okey,所以我在我正在构建的Android应用程序中的Sliding抽屉上实现了一个按钮。唯一的问题是,当我按下按钮时,整个滑动抽屉被按下并向上滑动。

我知道我可以在XML中禁用“按下以向上滑动”,但这似乎不起作用,因为滑动抽屉仍然在没有向上滑动的情况下被按下。

如果我调用slidingDrawer.lock();功能按钮实际工作,但滑动抽屉不能向上滑动甚至按下。

任何人都有解决这个问题的简单方法吗?

3 个答案:

答案 0 :(得分:6)

如果我理解你已经在SlidingDrawer手柄上添加了按钮,并且当用户按下它们并按下/拖动手柄时保持标准的SlidingDrawer行为时,你希望它们像按钮一样工作?

我刚解决了类似的问题。

我的手柄看起来像那样:

Capture of the layout

它由两个按钮和一个中心TextView组成,它将是真正的句柄(作为标准的SlidingDrawer句柄作出反应)。

要使按钮独立于SlidingDrawer工作,我在标准SlidingDrawer.java类的onInterceptTouchEvent方法中更改了一些源代码(从android代码源复制粘贴源文件):

public boolean onInterceptTouchEvent(MotionEvent event) {
    //...
    final Rect frame = mFrame;
    final View handle = mHandle;

    // original behaviour
    //mHandle.getDrawingRect(frame);

    // New code
    View trackHandle = mTrackHandle;
    // set the rect frame to the mTrackHandle view borders instead of the hole handle view

    // getParent() => The right and left are valid, but we need to get the parent top and bottom to have absolute values (in screen)
    frame.set(trackHandle.getLeft(), ((ViewGroup) trackHandle.getParent()).getTop(), trackHandle.getRight(), ((ViewGroup) trackHandle.getParent()).getBottom());



    if (!mTracking && !frame.contains((int) x, (int) y)) {
        return false;
    }
    //...
}

我还为mTrackHandle属性添加了一个setter,用于在活动创建期间设置要使用的真正hanlde:

protected void onCreate(Bundle savedInstanceState) {
    //...
    mSlidingDrawer.setTrackHandle((View) findViewById(R.id.menu_handle_TextView_Title));
    //...
}

之后,您可以在两个按钮上设置标准侦听器。他们会像魅力一样工作。

答案 1 :(得分:2)

回应Joakim Engstrom: 是的,这是可能的! 要做到这一点,你必须覆盖onInterceptTouchEvent,如下所示。

        @Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    rect = new Rect(handle.getLeft(), ((View) handle.getParent()).getTop(),
            handle.getRight(), ((View) handle.getParent()).getBottom());
    if (!rect.contains((int) event.getX(), (int) event.getY())) {
        if (event.getAction() == MotionEvent.ACTION_UP)
            this.lock();
        else
            this.unlock();
        return false;
    } else {
        this.unlock();
        return super.onInterceptTouchEvent(event);
    }
}

您还必须添加一个setter,以便在创建活动期间将句柄设置为实际句柄视图。

答案 2 :(得分:0)

可能这段代码可以帮到你 https://github.com/xPutnikx/SlidingDrawerWithButtons