自定义抽屉布局 - 单击透明度

3

我在我的项目中使用了抽屉布局(Drawer Layout)。我想要像Google+ Android应用程序一样自定义抽屉布局。在"主"ListView的上方我添加了一个ImageView。这很好地实现了。代码如下:

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

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<RelativeLayout
    android:id="@+id/drawer_layout_relative"
    android:layout_width="240dp"
    android:layout_height="wrap_content"
    android:layout_gravity="start" >

    <ImageView
        android:id="@+id/drawer_header_image"
        android:layout_width="wrap_content"
        android:layout_height="85dp"
        android:src="@drawable/ic_logo_blue" />

    <ProgressBar
        android:id="@+id/drawer_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/drawer_header_image"
        android:background="#ffffffff" />

    <ListView
        android:id="@+id/drawer_listview"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_below="@id/drawer_progress"
        android:background="#ffffffff"
        android:choiceMode="singleChoice" />
</RelativeLayout>

当你点击 ListView 中的一个项时,一个 fragment 会加载到 FrameLayout 中。这也完美地发挥作用。 但是有一个问题。ImageView 也是“可点击”的。所以,当抽屉打开时,如果单击 ImageView,则会单击后面的 ListView(在片段上)!我不想要那样。所以我尝试使用 clickable:false 在 ImageView 上。但不起作用... 这里有一个小演示视频:http://www.vidup.de/v/Ao71r/ 我该如何使 ImageView 不可点击?!
1个回答

7
为了防止点击事件从抽屉传递到背后的视图,您需要将抽屉中的视图设置为可点击,特别是所有其他视图的父视图,以便在没有子视图消耗它们的情况下消耗所有触摸事件。
将您的RelativeLayout代码更改为 drawer_layout_relative,如下所示(注意:我添加了android:clickable="true"到相对布局):
<RelativeLayout
    android:id="@+id/drawer_layout_relative"
    android:layout_width="240dp"
    android:clickable="true"
    android:layout_height="wrap_content"
    android:layout_gravity="start" >

默认情况下,如果一个视图不处理任何点击事件,它会让点击事件传递到其后面的视图。你有一个 ImageView、一个 ProgressBar 和一个 ListView:ListView 处理点击事件,所以它会消耗在它上面的所有触摸事件。ProgressBar 和 ImageView 默认只是显示内容,不处理点击事件,所以系统会将点击事件传递给你在抽屉后面的列表。这三个视图都在一个 RelativeLayout 中。如果我们将该 RelativeLayout 设置为可点击,它会收集 ImageView 和 ProgressBar 没有处理的点击事件,并阻止这些点击事件传递到它下面的视图。
将 android:clickable="true" 视为一种阻止与设置此属性的视图下面的任何视图交互的方法。
更多解释,请参见 this question

谢谢。运行得很完美。但有点好奇,当我们想要“不可点击”时,它会使视图变得可点击 :) - StefMa
1
如果我们将整个抽屉都设为可点击,它会阻止抽屉下面的视图看到任何点击。我更新了我的答案,并提供了更多的解释,希望能使事情变得更加清晰 :) - anthonycr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接