- ScrollView и HorizontalScrollView
- Методы scrollBy() и scrollTo()
- Могу ли я прокручивать ScrollView программно в Android?
- 16 ответов
- Пример использования ScrollView в Android
- Обзор Scrollview в Android
- Советы по использованию Scrollview
- Пример использования Scrollview в Android
- Как прокрутить в начало длинного макета ScrollView?
- Могу ли я прокручивать ScrollView программно в Android?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
ScrollView и HorizontalScrollView
При большом количестве информации, которую нужно поместить на экране приходится использовать полосы прокрутки. В Android существуют специальные компоненты ScrollView и HorizontalScrollView, которые являются контейнерными элементами и наследуются от ViewGroup. Обратите внимание, что класс TextView использует свою собственную прокрутку и не нуждается в добавлении отдельных полос прокрутки. Но использование отдельных полос даже с TextView может улучшить вид вашего приложения и повышает удобство работы для пользователя.
На панели инструментов компоненты можно найти в разделе Containers.
В контейнеры ScrollView и HorizontalScrollView можно размещать только один дочерний элемент (обычно LinearLayout), который в свою очередь может быть контейнером для других элементов. Виджет ScrollView, несмотря на свое название, поддерживает только вертикальную прокрутку, поэтому для создания вертикальной и горизонтальной прокрутки необходимо использовать ScrollView в сочетании с HorizontalScrollView. Обычно ScrollView используют в качестве корневого элемента, а HorizontalScrollView в качестве дочернего. Можно и наоборот, пробуйте.
В в теле метода onCreate() создайте ссылку на элемент TextView, объявленный в XML-разметке, и запишите в него через метод setText() какой-нибуль длинный текст, который не поместится в видимые размеры экрана устройства:
Запустив проект, вы должны увидеть вертикальную и горизонтальную полосы прокрутки при попытке скролирования.
Если полосы прокрутки вас раздражают, то используйте атрибут android:scrollbars=»none», который скроет их.
По такому же принципу можете вложить ImageView, чтобы просматривать большие картинки:
Методы scrollBy() и scrollTo()
Вы можете программно прокручивать контент с помощью методов scrollBy() и scrollTo(). Например, можно организовать автоматическую прокрутку во время чтения. В нашем примере мы будем прокручивать контент с помощью трёх кнопок.
Сам код для методов:
Дополнительное чтение
Библиотека ParallaxScrollView с использованием эффекта параллакса. Вы прокручиваете длинный текст, а задний фон прокручивается чуть медленнее. Возможно, кому-то пригодится. Там же можно скачать готовое демо и просмотреть в действии.
Источник
Могу ли я прокручивать ScrollView программно в Android?
есть ли способ прокрутить ScrollView программно на определенную позицию?
Я создал динамический TableLayout который находится в ScrollView . Поэтому я хочу, чтобы это было конкретное действие (например, нажатие кнопки и т. д.) конкретная строка должна автоматически прокручиваться в верхнюю позицию.
16 ответов
ответ от Pragna не всегда работает, попробуйте следующее:
я хотел, чтобы scrollView прокручивался непосредственно после onCreateView () (не после, например, нажатия кнопки). Чтобы заставить его работать, мне нужно было использовать ViewTreeObserver:
но будьте осторожны, что это будет называться каждый раз, когда что-то получает layouted (e.g Если вы установили вид невидимый или аналогичный), поэтому не забудьте удалить этот прослушиватель, если он вам больше не нужен:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) на SDK Lvl
public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) в SDK Lvl >= 16
использовать что-то вроде этого:
здесь много хороших ответов, но я хочу добавить только одну вещь. Иногда случается, что вы хотите прокрутить ScrollView до определенного вида макета, а не полный прокрутки вверх или вниз.
простой пример: в регистрационной форме, если пользователь нажимает кнопку «Регистрация», когда текст редактирования формы не заполнен, вы хотите прокрутить до этого конкретного текста редактирования, чтобы сообщить пользователю, что он должен заполнить это поле.
В этом случае, вы можете сделайте что-нибудь вроде этого:
или, если вы хотите гладкую прокрутку вместо мгновенной прокрутки:
очевидно, вы можете использовать любой тип представления вместо редактирования текста. Обратите внимание, что getBottom() возвращает координаты представления на основе его родительского макета, поэтому все виды, используемые внутри ScrollView, должны иметь только родительский (например, линейный макет).
Если у вас есть несколько родителей внутри ребенка ScrollView, единственное решение, которое я нашел вызвать requestChildFocus на родительский вид:
но в этом случае вы не можете иметь гладкий свиток.
Я надеюсь, что этот ответ может помочь кому-то с такой же проблемой.
Источник
Пример использования ScrollView в Android
В этой статье мы рассмотрим пример использования ScrollView в простом Android приложении.
ScrollView — служит для упаковки иерархии объектов View в контейнер, который можно прокручивать (скролить).
Обзор Scrollview в Android
Контейнер Scrollview представляет собой особый тип FrameLayout. Его особенность состоит в том, что он позволяет пользователям просматривать контент, который занимает больше места, чем физически есть на дисплее. Иными словами — просматривать контент, который не вмещается на экране без прокрутки.
Scrollview может содержать только один дочерний элемент или контейнер ViewGroup .
Советы по использованию Scrollview
- Никогда не используйте view-компонент ListView или GridView вместе со ScrollView. ListView предназначен для отображения списка элементов и оптимизирован для работы с большим объемом данных. Кроме того, он содержит встроенные возможности для прокрутки содержимого.
- Контейнер Scrollview поддерживает только вертикальную прокрутку. Если Вы хотите добавить горизонтальную прокрутку, то нам понадобится другой наследник FrameLayout — контейнер HorizontalScrollView.
- В xml разметке контейнер ScrollView имеет полезное свойство android:fillViewport , которое определяет, должен ли Scrollview растягивать свое содержание, чтобы заполнить доступное место на экране. Также доступен метод для установки этого значения в коде: setFillViewport(boolean) .
Пример использования Scrollview в Android
Теперь создадим макет, в котором будет виджет ImageView с картинкой и два TextView: для заголовка и текста. Все это обернем в вертикальный LinearLayout и поместим в корневой ScrollView (помним, что Scrollview не может содержать больше одного дочернего элемента):
Источник
Как прокрутить в начало длинного макета ScrollView?
Для части моего приложения пользователю представлен список имен и предлагается сгруппировать их по своему усмотрению.
(Обратите внимание, что код ListView был скопирован дословно из учебника Android Views. Я еще не настроил его на свои нужды, я просто пытаюсь выяснить, как это сделать.)
Основной макет – LinearLayout, содержащий ScrollView (называемый «groupsScrollView» в коде ниже), содержащий RelativeLayout. У меня есть несколько кнопок и текст, а затем мой ListView под ним, который отображает список имен. Все это выше, чем видимая область экрана, поэтому пользователю разрешено прокручивать вертикально, чтобы увидеть все.
Все это прекрасно работает, за исключением случаев, когда страница загружается, она всегда предварительно прокручивается вверху моего ListView – в середине страницы. Текст и кнопки, которые я создал, которые говорят пользователю, что делать, не видны.
Я могу захватить экран и прокручивать вверх, это работает отлично, но я бы хотел, чтобы экран загружался уже прокручиваемым вверх. Пользователю не нужно прокручивать UP, чтобы увидеть верхнюю часть только что загруженной страницы. Но все, что я пытался программно прокрутить до верхней части экрана, не удалось.
Вот мой метод onCreate:
Линия «mainScrollView.pageScroll (View.FOCUS_UP)) является проблемой. Она не вызывает ошибку, но она ничего не делает. Я пробовал scrollTo (0,0), scrollDirection (View.FOCUS_UP ), И все остальное, о чем я могу думать.
Поскольку я не получаю ошибку, я должен предположить, что эти команды прокрутки на самом деле работают, но что они прокручиваются вверху списка ListView, а не вверху ScrollView или RelativeLayout, которые его содержат. Это, похоже, подтверждается собственным описанием Google метода scrollTo (int x, int y), где они говорят: «Эта версия также зажимает прокрутку до границ нашего ребенка».
Поэтому, чтобы сделать длинный вопрос еще длиннее, как мне загрузить кучу просмотров на экране, содержащемся в ScrollView, а затем программно прокрутить все это до верхней части страницы, чтобы пользователь мог взаимодействовать с ним?
он должен работать.
Имел ту же проблему, вероятно, какую-то ошибку.
Даже fullScroll(ScrollView.FOCUS_UP) из другого ответа не работает.
Единственное, что сработало для меня, – это вызвать scroll_view.smoothScrollTo(0,0) сразу после появления диалогового окна.
У меня была такая же проблема, и это исправило это. Надеюсь, это поможет вам.
scrollViewObject.fullScroll(ScrollView.FOCUS_UP) работает отлично, но только проблема с этой строкой заключается в том, что при заполнении данных в scrollViewObject вы вызываете немедленно. Вы должны подождать несколько миллисекунд, пока данные не будут заполнены. Попробуйте этот код:
Основная проблема для всех этих действительных решений заключается в том, что вы пытаетесь переместить свиток, когда он еще не нарисован на экране.
Вам нужно подождать, пока на экране не появится вид прокрутки, а затем переместите его на любое из этих решений. Это лучшее решение, чем postdelay, потому что вы не возражаете против задержки.
Источник
Могу ли я прокручивать ScrollView программно в Android?
Есть ли способ прокрутить a ScrollView программно в определенную позицию?
Я создал динамический TableLayout , который помещается в ScrollView . Поэтому я хочу, чтобы при определенном действии (например, нажатии кнопки и т.д.) Конкретная строка должна автоматически прокручиваться в верхнюю позицию.
Возможно ли это?
ОТВЕТЫ
Ответ 1
Ответ 2
Ответ от Pragna не всегда работает, попробуйте это:
если вы хотите прокрутить, чтобы начать
Ответ 3
Мне нужно, чтобы scrollView прокручивался непосредственно после onCreateView() (не после нажатия кнопки). Чтобы заставить его работать, мне нужно было использовать ViewTreeObserver:
Но будьте осторожны, что это будет вызываться каждый раз, когда что-то получится макетированным (например, если вы установите невидимый или похожий вид), не забудьте удалить этот прослушиватель, если он вам больше не нужен:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) на SDK Lvl public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) в SDK Lvl >= 16
Ответ 4
Используйте что-то вроде этого:
Ответ 5
Здесь есть много хороших ответов, но я хочу только добавить одну вещь. Иногда бывает, что вы хотите прокрутить свой ScrollView до определенного вида макета, а не полный свиток вверх или снизу.
Простой пример: в регистрационной форме, если пользователь нажимает кнопку «Регистрация», когда текст редактирования формы не заполняется, вы хотите прокрутить этот текст редактирования, чтобы сообщить пользователю, что он должен заполнить эту поле.
В этом случае вы можете сделать что-то вроде этого:
или, если вы хотите гладкую прокрутку вместо мгновенного прокрутки:
Очевидно, вы можете использовать любой тип представления вместо редактирования текста. Обратите внимание, что getBottom() возвращает координаты представления на основе его родительского макета, поэтому все представления, используемые внутри ScrollView, должны иметь только родительский элемент (например, Linear Layout).
Если у вас есть несколько родителей внутри дочернего элемента ScrollView, единственным найденным решением является вызов requestChildFocus в родительском представлении:
но в этом случае вы не можете иметь гладкую прокрутку.
Я надеюсь, что этот ответ может помочь кому-то с той же проблемой.
Ответ 6
Попробуйте использовать scrollTo метод Подробнее
Ответ 7
Если вы хотите прокручивать мгновенно, вы можете использовать:
Или если вы хотите прокручивать плавно и медленно, чтобы вы могли использовать это:
Ответ 8
У меня это получилось, чтобы прокрутить до конца ScrollView (с TextView внутри):
(я положил это на метод, который обновляет TextView)
Ответ 9
Скажем, вы получили один Layout и внутри этого, вы получили много Views . Итак, если вы хотите прокручивать до любого View программно, вам нужно написать следующий фрагмент кода:
content_main.xml
MainActivity.java
Если вы хотите прокрутить до определенного View , скажем txtview, в этом случае просто напишите:
И вы сделали..
Ответ 10
Примечание: если вы уже в потоке, вам нужно создать новый поток сообщений, или он не прокручивает новую длинную высоту до полного конца (для меня). Для примера:
Ответ 11
Добавление другого ответа, не связанного с координатами.
Это приведет к желаемому фокусу (но не к верхней позиции):
public void RequestChildFocus (просмотр дочернего объекта, просмотр сфокусирован)
дочерний — ребенок этого ViewParent, который хочет сосредоточиться. Это представление будет содержать сфокусированное представление. Это не обязательно то, что на самом деле имеет фокус.
сфокусировано — представление, которое является потомком ребенка, на самом деле имеющим фокус
Ответ 12
** для прокрутки до нужной высоты. Я придумал хорошее решение **
Ответ 13
просто прокрутка страницы:
Ответ 14
Каждый отправляет такие сложные ответы.
Я нашел простой ответ для прокрутки донизу, красиво:
И, если необходимо, вы можете поместить вторую строку кода выше в runnable:
Мне потребовалось много исследований и игр, чтобы найти это простое решение. Надеюсь, это тоже поможет!:)
Ответ 15
Я использовал Runnable с sv.fullScroll(View.FOCUS_DOWN); Он отлично работает для непосредственной проблемы, но этот метод заставляет ScrollView отображать Focus со всего экрана, если вы делаете AutoScroll каждый раз, никакая EditText не сможет получать информацию от пользователя, в моем решении использовался другой код под runnable:
sv.scrollTo(0, sv.getBottom() + sv.getScrollY());
делая то же самое, не теряя внимания к важным представлениям
Источник