以编程方式获取ScrollView的子级

时间:2019-01-04 10:59:33

标签: java android android-scrollview

我制作了一个自定义ScrollView,其中有一个孩子(布局)。在findViewByid中使用CustomScrollView.java通过ID查找子项会导致应用崩溃,因此可以通过类似于this(检测自定义滚动视图)的简单方式来找到该子项,或者getParent()(它检测滚动视图和子元素都在其中的父布局)?

我正在尝试将requestDisallowInterceptTouchEvent(true);应用于自定义ScrollView的子级。

xml:

<?xml version="1.0" encoding="utf-8"?>

<com.example.test4.CustomScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/dynamic_status_scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    tools:context=".MainActivity">

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/dynamic_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:context=".MainActivity">
    </android.support.constraint.ConstraintLayout>

</com.example.test4.CustomScrollView>

我要在其中添加CustomScrollView.java的{​​{1}}中的代码:

requestDisallowInterceptTouchEvent

问题:

简而言之,我想找到自定义ScrollView的子项,即ID为 @Override public boolean onTouchEvent(MotionEvent ev) { // Add here return super.onTouchEvent(ev); } 的布局,而无需使用dynamic_status

1 个答案:

答案 0 :(得分:1)

您应该可以这样做:

@Override
public boolean onTouchEvent(MotionEvent ev) {
    ((ConstraintLayout)getChildAt(0)).requestDisallowInterceptTouchEvent(true);
    return super.onTouchEvent(ev);
}

您始终可以使用getChildAt访问子视图(嵌套的视图比当前视图更深)。由于requestDisallowInterceptTouchEvent仅适用于ViewGroup,因此您必须将其直接投射到ConstraintLayout上,或者-为了更好的可重用性,将其投射到ViewGroup。

请注意,如果孩子有空,我还没有提供任何检查。

对于Kotlin和Java,此代码也相同。没什么区别(从语法上是可以的,但是概念是相同的。)