Макет: У меня есть 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;
}
});
Это решение не работает:
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или я что-то пропустил. Спасибо!
@HenriqueMS Это означало бы, что текст редактирования будет в LinearLayout в NestedScrollView, вложенном в NestedScrollView ... Не сработало.
@HenriqueMS Возможно, вы могли бы опубликовать свой код? Я мог неправильно понять ваши предыдущие указания




Ответ на самом деле проще, чем я думал.
После вставки вашего xml (и внесения необходимых изменений для его сборки - отсутствующие размеры и т. д.) я просто изменил высоту вашего EditText на wrap_content, и ошибка исчезла.
Ответ лежит здесь:
Сравнение измерений EditText в разные моменты времени, слева с height=match_parent и справа с height=wrap_content
Слева:
EditText рисуется на пустом экране определенного размера, вы вставляете текст, а его размер не меняется. Отображение/скрытие клавиатуры — это одно важное событие в жизни экрана, оно называется изменение конфигурации, оно заставляет элементы снова измеряться и перерисовываться.
Справа:
Если вы измените высоту EditText на wrap_content, это приведет к принудительному измерению и перерисовке сразу после вставки.
Надеюсь это поможет :)
Я думал, что установка wrap_content для EditText сделает интерактивную область очень маленькой, но это не так. И это решение работает, спасибо! :)
Последующий вопрос: Какой инструмент вы использовали для получения измерений?
Нет проблем;) вы можете сделать это несколькими способами, самый простой — использовать инспектор компоновки при запуске приложения с отладчиком (я думаю, меню инструментов) developer.android.com/studio/debug/макет-инспектор
установить активность как,
android:windowSoftInputMode = "adjustResize"
@HenriqueMS Я удалил LinearLayout, который обернул NestedScrollView, то же поведение