以编程方式获取 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 也是相同的。它没有任何区别(语法上是的,但概念是相同的)。
我做了一个自定义 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 也是相同的。它没有任何区别(语法上是的,但概念是相同的)。