为什么parent linearLayout会消耗所有儿童点击?

时间:2018-03-13 18:40:51

标签: android android-layout android-view bottom-sheet

在我的活动中,我使用底页布局 - 即id为 bottom_sheet 的NestedScrollView。

在NestedScrollView内部我有LinearLayout,它包含另一个布局(layout_player)。

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/cl_root"
    >

       <some layouts here />

    </android.support.constraint.ConstraintLayout>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
        android:visibility="invisible"
    >

    <LinearLayout
        android:id="@+id/player_container"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_gravity="bottom"
    >

      <include layout="@layout/layout_player"
      />

    </LinearLayout>
  </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

包含的layout_player布局包含ConstraintLayout和一些指南,而RelativeLayout包含ImageView。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="100dp"
>
 ...
<RelativeLayout
      android:id="@+id/rl_play"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      app:layout_constraintTop_toTopOf="@id/guidelineTop"
      app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
      app:layout_constraintDimensionRatio="H,1:1"
  >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srcCompat="@drawable/ic_play"
    />

  </RelativeLayout>
...
</android.support.constraint.ConstraintLayout>

为布局 layout_player 中的视图设置clickListeners后,ID为 player_container 的父LinearLayout会消耗其子项的所有点击。但我需要点击儿童的事件 - 而不是父母。

  

如何在其父级内点击子项?

     

在我的情况下,如何在位于 LinearLayout 内的 ContraintLayout 内获得 RelativeLayout 的点击事件?

1 个答案:

答案 0 :(得分:0)

您要找的是descendantFocusability

在你不想要焦点的布局上,你可以这样做:

android:descendantFocusability="afterDescendants"

这意味着在布局获得焦点之前,它将关注子视图。

编辑(带示例):

<LinearLayout
    android:id="@+id/player_container"
    android:focusable="false"
    android:descendantFocusability="afterDescendants"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_gravity="bottom">

    <include layout="@layout/layout_player" />

</LinearLayout>

然后在layout_player档案中:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:descendantFocusability="afterDescendants"
    android:layout_width="match_parent"
    android:layout_height="100dp" >

 ...
    <RelativeLayout
        android:id="@+id/rl_play"
        android:clickable="true"
        android:focusable="true"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="@id/guidelineTop"
        app:layout_constraintBottom_toBottomOf="@id/guidelineBottom"
        app:layout_constraintDimensionRatio="H,1:1">

        ...

    </RelativeLayout>
...
</android.support.constraint.ConstraintLayout>

因此,我们在两个不同的布局上添加了android:descendantFocusability="afterDescendants行,并允许点击并通过这样做来关注RelativeLayout

android:clickable="true"
android:focusable="true"

注意:如果这不起作用,您能否说明如何在RelativeLayout上设置听众?