1

我的问题如下:我想创建一个滑动抽屉,其中处理程序(滑动用于打开/关闭的视图)是一个组合视图,其中存在一个按钮,如下图所示:

在此处输入图像描述

期望的行为是:

  1. 当用户在处理程序中单击时,抽屉打开(按钮跟随视图,因为它附加在其上);
  2. 如果我点击按钮,系统会做出一些不同的事情(在我的例子中,我打开一个对话框,其中包含将视图添加为抽屉子项的选项);

这种类型实现的主要问题是监听器发生冲突,因为按钮“+”是处理程序的一部分,不能在点击时创建覆盖的监听器。作为第一种方法,我正在考虑以编程方式完成所有这些,但我真的想知道是否有另一种简单的方法来进行这种布局。

有没有人可以给出提示,或者知道一种仅使用 xml 来实现它的方法?提前致谢!

4

1 回答 1

1

您可以使用LinearLayout作为 SlidingDrawer 容器的句柄或内容元素的容器。如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <SlidingDrawer android:id="@+id/drawer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="showPopUp"
        android:handle="@+id/handle"
        android:content="@+id/content">
        <LinearLayout android:id="@id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <!-- here goes your content -->
        </LinearLayout>
        <LinearLayout android:id="@id/handle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffff5600"
            android:orientation="horizontal">
            <TextView android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="4"
                android:layout_gravity="left"
                android:text="musicas" />
            <Button android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="showPopUp"
                android:text="+" />
        </LinearLayout>
    </SlidingDrawer>
</LinearLayout>

它允许您像上面的屏幕截图一样进行布局,但它不允许捕获按钮按下事件。为此,我进行了一些研究,并建议覆盖 MultiDirectionSlidingDrawer(来源http://blog.sephiroth.it/2011/03/29/widget-slidingdrawer-top-to-bottom/)。我这样做如下:在onInterceptTouchEvent()方法中,我添加了以下代码final View handle = mHandle;

    boolean handleTouch = false;
    if (mHandle instanceof ViewGroup) {
        ViewGroup group = (ViewGroup) mHandle;

        int count = group.getChildCount();
        for (int i = 0; i < count; i++) {
            View v = group.getChildAt(i);
            v.getHitRect(frame);
            if (frame.contains((int) x, (int) y)) {
                handleTouch = v.onTouchEvent(event);
                if (handleTouch) {
                    return false;
                }
            }
        }
    }

现在它分别处理来自按钮和抽屉本身的事件。

于 2012-06-14T21:22:17.977 回答