EditText не прокручивается внутри NestedScrollView

Макет: У меня есть EditText и 2 RecyclerView внутри NestedScrollView, которые не видны (видимость = исчезла)

<androidx.coordinatorlayout.widget.CoordinatorLayout 
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical">

    //... toolbar

    <LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:orientation = "vertical"
        app:layout_behavior = "@string/appbar_scrolling_view_behavior">

        <androidx.core.widget.NestedScrollView
            android:id = "@+id/scrollView"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            android:layout_marginBottom = "?attr/actionBarSize"
            android:fillViewport = "true"
            android:scrollbars = "vertical">

            <LinearLayout
                android:layout_width = "match_parent"
                android:layout_height = "match_parent"
                android:orientation = "vertical">

                <EditText
                    android:id = "@+id/editText"
                    android:layout_width = "match_parent"
                    android:layout_height = "match_parent"
                    android:layout_weight = "1"
                    android:backgroundTint = "@android:color/transparent"
                    android:gravity = "top"
                    android:inputType = "textMultiLine|textCapSentences"
                    android:padding = "@dimen/activity_margin"
                    android:singleLine = "false" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id = "@+id/rv_items"
                    android:padding = "@dimen/activity_margin"
                    android:layout_width = "match_parent"
                    android:layout_height = "wrap_content"
                    android:layout_weight = "1"
                    android:scrollbars = "vertical"
                    android:visibility = "gone" />
   
                <androidx.recyclerview.widget.RecyclerView
                    android:id = "@+id/rv_Labels"
                    android:layout_width = "match_parent"
                    android:layout_height = "wrap_content"
                    android:padding = "12dp"
                    android:visibility = "gone" />

            </LinearLayout>

        </androidx.core.widget.NestedScrollView>
        
    </LinearLayout>

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id = "@+id/coordinator_layout"
        android:layout_width = "match_parent"
        android:layout_height = "100dp"
        android:layout_gravity = "bottom"
        android:layout_marginBottom = "?actionBarSize" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
            //...
    />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Эта проблема: Когда я ввожу больше текста, чем высота экрана, EditText прокручивается вниз до того места, где находится курсор. Но когда я пытаюсь прокрутить вверх, ничего не происходит. Вот запись экрана, которую я сделал.

Не могу прокрутить:

  • после первого ввода/вставки длинного текста.

Может прокручивать:

  • после повторного открытия активности с уже введенным текстом
  • после закрытия клавиатуры
  • после закрытия клавиатуры и открытия ее снова

Поиск похожих проблем дал:

...

editText.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.editText) {
            v.getParent().requestDisallowInterceptTouchEvent(true);
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:
                v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }
        }
        return false;
    }
});

Это решение не работает:

  1. Вопросы касаются ScrollViews, а не NestedScrollViews. И NestedScrollView — одно из предложенных решений (которым я уже пользуюсь)
  2. Когда я добавляю приведенный выше код, EditText можно прокручивать, но только при отображении клавиатуры. Если это не так, то прокрутка невозможна - попытка прокрутки приводит к выделению текста.
  3. Прокрутка (при открытой клавиатуре) перемещает курсор.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или я что-то пропустил. Спасибо!

@HenriqueMS Я удалил LinearLayout, который обернул NestedScrollView, то же поведение

Akres 31.05.2019 19:28

@HenriqueMS Это означало бы, что текст редактирования будет в LinearLayout в NestedScrollView, вложенном в NestedScrollView ... Не сработало.

Akres 31.05.2019 19:36

@HenriqueMS Возможно, вы могли бы опубликовать свой код? Я мог неправильно понять ваши предыдущие указания

Akres 31.05.2019 20:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
1 333
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ответ на самом деле проще, чем я думал. После вставки вашего xml (и внесения необходимых изменений для его сборки - отсутствующие размеры и т. д.) я просто изменил высоту вашего EditText на wrap_content, и ошибка исчезла.

Ответ лежит здесь: Сравнение измерений EditText в разные моменты времени, слева с height=match_parent и справа с height=wrap_content

Слева: EditText рисуется на пустом экране определенного размера, вы вставляете текст, а его размер не меняется. Отображение/скрытие клавиатуры — это одно важное событие в жизни экрана, оно называется изменение конфигурации, оно заставляет элементы снова измеряться и перерисовываться.

Справа: Если вы измените высоту EditText на wrap_content, это приведет к принудительному измерению и перерисовке сразу после вставки.

Measurement of EditText at different times

Надеюсь это поможет :)

Я думал, что установка wrap_content для EditText сделает интерактивную область очень маленькой, но это не так. И это решение работает, спасибо! :)

Akres 01.06.2019 10:15

Последующий вопрос: Какой инструмент вы использовали для получения измерений?

Akres 01.06.2019 10:17

Нет проблем;) вы можете сделать это несколькими способами, самый простой — использовать инспектор компоновки при запуске приложения с отладчиком (я думаю, меню инструментов) developer.android.com/studio/debug/макет-инспектор

HenriqueMS 01.06.2019 12:44

установить активность как,

android:windowSoftInputMode = "adjustResize"

Другие вопросы по теме