Android Studio - Как остановить сброс ScrollView в начало - PullRequest
0 голосов
/ 11 июля 2020

В настоящее время я использую макет ограничения в scrollView, и в настоящее время у меня есть textView, который находится довольно далеко вниз по экрану, поэтому мне нужно прокрутить вниз, чтобы увидеть его. Однако всякий раз, когда я заканчиваю sh редактирование textView, которое находится внизу экрана (например, изменяя его ограничение, перетаскивая его стороны), экран всегда сбрасывается в верхнюю часть scrollView. Есть ли способ предотвратить это? Извините, если это сбивает с толку, это немного сложно объяснить. Пожалуйста, дайте мне знать, если требуются дополнительные пояснения.

Вот видео проблемы: imgur.com/a/3libvbo

Спасибо!

Вот файл xml:

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/nav_graph" />

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout_editor_absoluteX="308dp"
    tools:layout_editor_absoluteY="322dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="BottomOfScrollView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            tools:layout_editor_absoluteY="1061dp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TopOfScrollView"
            tools:layout_editor_absoluteX="112dp"
            tools:layout_editor_absoluteY="228dp" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

Ответы [ 3 ]

0 голосов
/ 16 июля 2020

Однако всякий раз, когда я sh заканчиваю редактирование textView, которое находится внизу экрана (например, изменяя его ограничение, перетаскивая его стороны), экран всегда сбрасывается в верхнюю часть scrollView

Это потому, что вы не ограничили макет должным образом

Попробуйте следующее:

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="BottomOfScrollView"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toBottomOf="@id/textView2"
                app:layout_constraintStart_toStartOf="parent"
                tools:layout_editor_absoluteY="1061dp" />

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TopOfScrollView"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"/>
        </androidx.constraintlayout.widget.ConstraintLayout>
    </ScrollView>

Теперь этот макет сделает ваш вид текста точно в центре макета один под другим

0 голосов
/ 18 июля 2020

Просматривая ваше видео, я вижу, что это проблема внутри вашей IDE, а не реальная проблема вашего приложения.

Здесь происходит то, что все, что находится внутри макета ограничений, требует как минимум 2 ограничений, вертикальный (верхний или нижний) и горизонтальный (левый или правый).

В вашем случае вы установили горизонтальные ограничения для обоих ваших представлений, но не вертикальные, поэтому IDE не знает, где разместите свой вид вертикально. Если бы вы запускали приложение на эмуляторе, они переместились бы в верхнюю часть макета ограничений. Каждый неограниченный вид go в верхнее левое положение по умолчанию.

Итак, помните: в схемах ограничений всегда используйте вертикальное и горизонтальное ограничение (конечно, вы можете использовать все 4 ограничения )

0 голосов
/ 14 июля 2020
scrollView.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        scrollView.smoothScrollTo(0, textView2.getBottom());
    }
}, 2000);

или

scrollView.post(new Runnable()
{
    @Override
    public void run()
    {
        scrollView.smoothScrollTo(0, textView2.getBottom());
    }
});

Расширение: Вызов postDelayed отправляет обработчику runnable. через 2 секунды вызывается метод запуска. В ScrollViews есть smoothScrollTo (x, y), используемый для прокрутки до позиции. Если прокрутка горизонтальная, вы должны использовать значение x, а если оно вертикальное, как в случае OP, вы прокручиваете по оси y. Если вы хотите, чтобы прокрутка выполнялась без задержек, используйте post () вместо postDelayed ().

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