如何在Android中禁用我的SlidingDrawer背后的视图?

时间:2010-04-07 23:20:10

标签: android view clickable slidingdrawer

我有一个从屏幕底部弹出的SlidingDrawer,填充屏幕大约80%。即使SlidingDrawer视图处于焦点,仍然可以单击SlidingDrawer后面的视图中的项目,按钮和其他元素。当SlidingDrawer处于活动/上拉/焦点时,我想要禁用其后面的整个视图,以便它无法接收点击和触摸。是否有一种禁用整个视图的好方法?我尝试过setEnable(false)和setClickable(false)但它们都没有工作。

帮助?

5 个答案:

答案 0 :(得分:12)

这是一种解决这个问题的方法(我也需要一个解决方案) - 抓住保存内容的linearLayout并添加一个点击监听器。让点击监听器响应点击(扔掉,无论如何) - 然后停止它传播到滑动抽屉下方的视图 - 它适用于我 - 并且它不会阻止抽屉中的其他项目。

答案 1 :(得分:2)

我已尝试将SlidingDrawer放入RelativeLayout,而不是LinearLayout。并设置 开场方法mySlidingDrawer.bringToFront()

所以我认为这可能是一个解决方案。

答案 2 :(得分:2)

在侧面布局中执行android:clickable="true"

例如以下文件是drawer.xml

内部LinearLayout android:id="@+id/drawer_view" clickable="true"

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </FrameLayout>      

        <LinearLayout
            android:id="@+id/drawer_view"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_gravity="start"
            android:clickable="true"
            android:background="@color/drawer_background">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:background="@drawable/order_list_selector"
                android:orientation="horizontal">

                <ImageView
                    android:layout_width="@dimen/user_image_w_h"
                    android:layout_height="@dimen/user_image_w_h"
                    android:scaleType="fitCenter"
                    android:id="@+id/drawerUserImage"
                    android:src="@drawable/ic_user_icon"
                    android:layout_gravity="center_vertical" />

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_gravity="center_vertical"
                    android:orientation="vertical"
                    android:layout_marginLeft="5dp"
                    android:padding="5dp">

                    <TextView
                        android:id="@+id/drawerUserNameTextView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Mansukh Ahir"
                        android:textColor="@android:color/black"
                        android:textSize="@dimen/font_large" />

                    <TextView
                        android:id="@+id/drawerEmailIdTextView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/font_very_small"/>
                </LinearLayout>
            </LinearLayout>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="@color/holo_gray_light" />

            <ListView
                android:id="@+id/drawerListSlideMenu"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:choiceMode="singleChoice"
                android:dividerHeight="1dp" />
        </LinearLayout>

    </android.support.v4.widget.DrawerLayout>

答案 3 :(得分:1)

Joe的回答并没有为我做到这一点。我的情况有点不同。我有一个有两个孩子的FrameLayout。只有一个孩子必须在特定时刻“活跃”,而第二个孩子在活动时,第一个孩子不应再处理任何输入。我的解决方案:

    public static void changeVGstate(ViewGroup current, boolean enable)
{
    current.setFocusable(enable);
    current.setClickable(enable);
    current.setEnabled(enable);

    for (int i = 0; i < current.getChildCount(); i++)
    {
        View v = current.getChildAt(i); 
        if (v instanceof ViewGroup)
            changeVGstate((ViewGroup)v, enable);
        else
        {
            v.setFocusable(enable);
            v.setClickable(enable);
            v.setEnabled(enable);
        }
    }
}

享受!

答案 4 :(得分:0)

我不知道这是否有效,但值得一试。呼叫 容器View上的setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)(滑动抽屉滑过的那个)。