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

Posted

技术标签:

【中文标题】如何在 Android 中禁用 SlidingDrawer 后面的视图?【英文标题】:How can I disable a view behind my SlidingDrawer in Android? 【发布时间】:2011-02-05 11:55:20 【问题描述】:

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

帮助?

【问题讨论】:

我也用滑动抽屉,但从来没有这个问题^^ 这个你搞定了吗?遇到同样的问题。 ***.com/questions/5393314/… 使用这个:-***.com/a/31587294/4395114 【参考方案1】:

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

【讨论】:

这相当于@mansukh 在下面所说的 - 但他的方式是更少的代码。【参考方案2】:

在侧边布局做android:clickable="true"

例如以下文件是drawer.xml

内部LinearLayoutandroid: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_
        android:layout_
        tools:context=".MainActivity">


        <FrameLayout
            android:id="@+id/container"
            android:layout_
            android:layout_>

        </FrameLayout>      

        <LinearLayout
            android:id="@+id/drawer_view"
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:layout_gravity="start"
            android:clickable="true"
            android:background="@color/drawer_background">

            <LinearLayout
                android:layout_
                android:layout_
                android:padding="10dp"
                android:background="@drawable/order_list_selector"
                android:orientation="horizontal">

                <ImageView
                    android:layout_
                    android:layout_
                    android:scaleType="fitCenter"
                    android:id="@+id/drawerUserImage"
                    android:src="@drawable/ic_user_icon"
                    android:layout_gravity="center_vertical" />

                <LinearLayout
                    android:layout_
                    android:layout_
                    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_
                        android:layout_
                        android:text="Mansukh Ahir"
                        android:textColor="@android:color/black"
                        android:textSize="@dimen/font_large" />

                    <TextView
                        android:id="@+id/drawerEmailIdTextView"
                        android:layout_
                        android:layout_
                        android:textSize="@dimen/font_very_small"/>
                </LinearLayout>
            </LinearLayout>

            <View
                android:layout_
                android:layout_
                android:background="@color/holo_gray_light" />

            <ListView
                android:id="@+id/drawerListSlideMenu"
                android:layout_
                android:layout_
                android:choiceMode="singleChoice"
                android:dividerHeight="1dp" />
        </LinearLayout>

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

【讨论】:

在我看来,这是解决相互“覆盖”的布局的最简单和最直接的解决方案 - 这使得覆盖页面的背景“吸收”点击而不是向下传递。跨度> 因为我无法覆盖SwipeRefreshLayout 方法canChildScrollUp() 这就是我使用这个解决方案的原因。【参考方案3】:

乔的回答对我没有用。我的情况有点不同。我有一个有两个孩子的 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】:

我尝试将SlidingDrawer 放入RelativeLayout,而不是LinearLayout。并设置 mySlidingDrawer.bringToFront() 在打开方式中。

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

【讨论】:

【参考方案5】:

我不知道这是否可行,但值得一试。称呼 setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS) 在您的容器视图上(滑动抽屉滑过的那个)。

【讨论】:

以上是关于如何在 Android 中禁用 SlidingDrawer 后面的视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中完全禁用上下文操作栏?

如何在 Android 中禁用 GridView 滚动?

如何在 Android 中启用/禁用日志级别?

如何禁用在android中单击ListView?

如何以编程方式在 Android 中禁用 GSM 连接

如何在 Android 的 web 视图中禁用文本选择?