在我的活动中,我使用底页布局 - 即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 的点击事件?
答案 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
上设置听众?