Получить дочерний ScrollView программно - PullRequest
0 голосов
/ 04 января 2019

Я создал пользовательский ScrollView, в котором есть один дочерний элемент (макет). Поиск ребенка по идентификатору с помощью findViewByid в CustomScrollView.java приводит к сбою приложения, поэтому его можно найти простым способом, подобным this (который обнаруживает пользовательский вид прокрутки) или getParent() (который обнаруживает родительский макет, внутри которого находится и scrollview, и дочерний элемент)?

Я пытаюсь применить 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, куда я хочу добавить requestDisallowInterceptTouchEvent:

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

Проблема:

Короче говоря, я хочу найти дочерний элемент пользовательского ScrollView, макет с идентификатором dynamic_status, без использования findViewById.

1 Ответ

0 голосов
/ 04 января 2019

Вы должны быть в состоянии сделать это так:

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

Вы всегда можете получить доступ к дочерним представлениям (представления, вложенные глубже, чем ваш текущий просмотр) с помощью getChildAt. Поскольку requestDisallowInterceptTouchEvent доступен только для ViewGroups, вы должны привести его непосредственно к вашему ConstraintLayout или - для лучшей повторного использования - к ViewGroup.

Обратите внимание, что я не включил никаких проверок, если ребенок доступен.

Этот код также одинаков для Kotlin и Java. Это не имеет никакого значения (синтаксически да, но концепция та же самая).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...