Android SlidingDrawer中的组合处理程序

时间:2012-06-12 22:48:32

标签: android layout slidingdrawer

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

enter image description here

理想的行为是:

  1. 当用户点击处理程序时,抽屉会打开(按钮跟随视图附着在其上);
  2. 如果我点击按钮,系统会做出不同的事情(在我的情况下,我会打开一个对话框,其中包含将视图添加为抽屉的孩子的选项);
  3. 这种类型的实现中的主要问题是,由于按钮“+”是处理程序的一部分并且无法创建覆盖的侦听器,因此侦听器处于冲突中。作为第一种方法,我想以编程方式完成所有这些,但我真的很想知道是否有另一种简单的方法来进行这种布局。

    有没有人有提示,或者只知道用xml实现这个的方法? 提前谢谢!

1 个答案:

答案 0 :(得分: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;
                }
            }
        }
    }

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