Могу ли я прокручивать ScrollView программно в Android?

Есть ли способ прокрутить ScrollView программно в определенную позицию?

Я создал динамический TableLayout который помещается в ScrollView . Поэтому я хочу, чтобы при определенном действии (например, нажатии кнопки и т. Д.) Конкретная строка должна автоматически прокручиваться до верхней позиции.

Является ли это возможным?

Solutions Collecting From Web of "Могу ли я прокручивать ScrollView программно в Android?"

 ScrollView sv = (ScrollView)findViewById(R.id.scrl); sv.scrollTo(0, sv.getBottom()); 

или

sv.scrollTo(5, 10);

Ответ от Pragna не всегда работает, попробуйте следующее:

 mScrollView.post(new Runnable() { public void run() { mScrollView.scrollTo(0, mScrollView.getBottom()); } }); 

или

 mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(mScrollView.FOCUS_DOWN); } }); 

Я хотел, чтобы scrollView прокручивался непосредственно после onCreateView () (не после нажатия кнопки). Чтобы заставить его работать, мне нужно было использовать ViewTreeObserver:

 mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } }); } }); 

Но будьте осторожны, что это будет вызываться каждый раз, когда что-то получает макет (например, если вы установите невидимое представление или подобное), поэтому не забудьте удалить этот прослушиватель, если он вам больше не нужен:

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) на SDK Lvl <16

или

public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim) в SDK Lvl> = 16

Используйте что-то вроде этого:

 mScrollView.scrollBy(10, 10); 

или

 mScrollView.scrollTo(10, 10); 

Здесь есть много хороших ответов, но я хочу только добавить одно. Иногда бывает, что вы хотите прокрутить ScrollView до определенного вида макета, а не полный свиток вверх или снизу.

Простой пример: в регистрационной форме, если пользователь нажимает кнопку «Регистрация», когда текст редактирования формы не заполняется, вы хотите прокрутить этот текст редактирования, чтобы сообщить пользователю, что он должен заполнить это поле.

В этом случае вы можете сделать что-то вроде этого:

 scrollView.post(new Runnable() { public void run() { scrollView.scrollTo(0, editText.getBottom()); } }); 

Или, если вы хотите гладкую прокрутку вместо мгновенного прокрутки:

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

Очевидно, вы можете использовать любой тип представления вместо редактирования текста. Обратите внимание: getBottom () возвращает координаты представления на основе его родительского макета, поэтому все представления, используемые внутри ScrollView, должны иметь только родительский элемент (например, Linear Layout).

Если у вас есть несколько родителей внутри дочернего элемента ScrollView, единственным решением, которое я нашел, является вызов requestChildFocus в родительском представлении:

 editText.getParent().requestChildFocus(editText, editText); 

Но в этом случае вы не можете иметь гладкий свиток.

Надеюсь, этот ответ поможет кому-то с той же проблемой.

Попробуйте использовать метод scrollTo Дополнительная информация

Если вы хотите прокручивать мгновенно, вы можете использовать:

 ScrollView scroll= (ScrollView)findViewById(R.id.scroll); scroll.scrollTo(0, scroll.getBottom()); OR scroll.fullScroll(View.FOCUS_DOWN); OR scroll.post(new Runnable() { @Override public void run() { scroll.fullScroll(View.FOCUS_DOWN); } }); 

Или если вы хотите прокручивать плавно и медленно, чтобы вы могли использовать это:

 private void sendScroll(){ final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { try {Thread.sleep(100);} catch (InterruptedException e) {} handler.post(new Runnable() { @Override public void run() { scrollView.fullScroll(View.FOCUS_DOWN); } }); } }).start(); } 

Я получил это, чтобы выполнить прокрутку к нижней части ScrollView (с TextView внутри):

(Я помещаю это в метод, который обновляет TextView)

 final ScrollView myScrollView = (ScrollView) findViewById(R.id.myScroller); myScrollView.post(new Runnable() { public void run() { myScrollView.fullScroll(View.FOCUS_DOWN); } }); 

Примечание: если вы уже в потоке, вам нужно создать новую ветку сообщений, или она не прокручивает новую длинную высоту до полного конца (для меня). Например:

 void LogMe(final String s){ runOnUiThread(new Runnable() { public void run() { connectionLog.setText(connectionLog.getText() + "\n" + s); final ScrollView sv = (ScrollView)connectLayout.findViewById(R.id.scrollView); sv.post(new Runnable() { public void run() { sv.fullScroll(sv.FOCUS_DOWN); /* sv.scrollTo(0,sv.getBottom()); sv.scrollBy(0,sv.getHeight());*/ } }); } }); } 

Добавление другого ответа, не связанного с координатами.

Это позволит вашему желаемому фокусу (но не в верхней позиции):

  yourView.getParent().requestChildFocus(yourView,yourView); 

Public void RequestChildFocus (просмотр дочернего элемента, просмотр сфокусирован)

Child – ребенок этого ViewParent, который хочет сосредоточиться. Это представление будет содержать сфокусированное представление. Это не обязательно взгляд, который на самом деле имеет фокус.

Focus – представление, которое является потомком ребенка, который фактически имеет фокус

Я использовал Runnable с sv.fullScroll (View.FOCUS_DOWN); Он отлично работает для непосредственной проблемы, но этот метод заставляет ScrollView отображать Focus со всего экрана, если вы делаете AutoScroll каждый раз, никакая EditText не сможет получать информацию от пользователя, мое решение использовало другой код Под управлением:

Sv.scrollTo (0, sv.getBottom () + sv.getScrollY ());

Делая то же самое, не теряя внимания к важным взглядам

Привет.

Все выкладывают такие сложные ответы.

Я нашел легкий ответ, для прокрутки на дно, красиво:

 final ScrollView myScroller = (ScrollView) findViewById(R.id.myScrollerView); // Scroll views can only have 1 child, so get the first child's bottom, // which should be the full size of the whole content inside the ScrollView myScroller.smoothScrollTo( 0, myScroller.getChildAt( 0 ).getBottom() ); 

И, при необходимости, вы можете поместить вторую строку кода выше, в runnable:

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

Мне потребовалось много исследований и игр, чтобы найти это простое решение. Надеюсь, это тоже поможет! 🙂

** для прокрутки до желаемой высоты. Я придумал какое-то хорошее решение **

  scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView.scrollBy(0, childView.getHeight()); } }, 100); 

Просто прокрутка страницы:

 ScrollView sv = (ScrollView) findViewById(your_scroll_view); sv.pageScroll(View.FOCUS_DOWN);