【问题标题】:Buttons on a Sliding Drawer? - Android滑动抽屉上的按钮? - 安卓
【发布时间】:2011-01-17 09:52:24
【问题描述】:

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

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

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

谁有这个问题的简单解决方案?

【问题讨论】:

    标签: android


    【解决方案1】:

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

    我刚刚解决了一个类似的问题。

    我的手柄看起来像这样:

    它由两个按钮和一个中心 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 属性添加了一个设置器,用于在活动创建期间设置要使用的真正句柄:

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

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

    【讨论】:

    • 这是一种方法 :) 确实有效。是否有可能只扩展基类,然后覆盖所需的方法?
    • 这里的 setTrackHandle 是什么?
    • 这是我添加到 Android SlidingDrawer 以允许设置 TrackHandle 的方法。默认情况下只有 getHandle() 方法。要添加它,您需要继承 SlidingDrawer 类并添加方法。
    【解决方案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 以在活动创建期间将句柄设置为实际句柄视图。

    【讨论】:

    • 我已经尝试了上面的代码,但它并没有使按钮可滑动。我的滑动抽屉里装满了recyclerview,里面有不同的物品。我需要整个手柄既可滑动又可点击。请帮助我。我什至问了一个问题here,但没有答案。
    【解决方案3】:

    也许这段代码可以帮助你 https://github.com/xPutnikx/SlidingDrawerWithButtons

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多