以编程方式获取 child 个 ScrollView

Get child of ScrollView programmatically

我做了一个自定义 ScrollView,其中有一个 child(布局)。在 CustomScrollView.java 中使用 findViewByid 通过 ID 查找 child 会导致应用程序崩溃,因此是否可以通过类似于 this 的简单方式找到它(它检测自定义滚动视图)或 getParent()(检测滚动视图和 child 都在其中的 parent 布局)?​​

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

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 内的代码,我想在其中添加 requestDisallowInterceptTouchEvent:

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // Add here
        return super.onTouchEvent(ev);
    }

问题:

总之,我想找到自定义ScrollView的child,id为dynamic_status的布局,而不用findViewById

你应该可以这样做:

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

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

请注意,如果 child 可用,我没有包含任何检查。

此代码对于 Kotlin 和 Java 也是相同的。它没有任何区别(语法上是的,但概念是相同的)。