¿Puedo desplazar un ScrollView programmatically en Android?

¿Hay alguna forma de desplazar un ScrollView programáticamente a una posición determinada?

TableLayout dynamic que se coloca en ScrollView . Entonces quiero que en una acción específica (como hacer clic en un Botón, etc.) la fila en particular se desplace automáticamente a una posición superior.

¿Es posible?

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

o

sv.scrollTo(5, 10);

La respuesta de Pragna no funciona siempre, prueba esto:

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

o

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

Quería que scrollView se desplazara directamente después de onCreateView () (no después de, por ejemplo, un clic de un botón). Para que funcione, necesitaba usar ViewTreeObserver:

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

Pero tenga en cuenta que se llamará cada vez que algo se distribuya (por ejemplo, si establece una vista invisible o similar), así que no se olvide de eliminar este oyente si ya no lo necesita con:

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

o

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

Usa algo como esto:

 mScrollView.scrollBy(10, 10); 

o

 mScrollView.scrollTo(10, 10); 

Aquí hay muchas buenas respuestas, pero solo quiero agregar una cosa. A veces sucede que desea desplazar su ScrollView a una vista específica del diseño, en lugar de un desplazamiento completo hacia la parte superior o inferior.

Un ejemplo simple: en un formulario de registro, si el usuario toca el botón “Registrarse” cuando un texto de edición del formulario no está lleno, desea desplazarse a ese texto de edición específico para decirle al usuario que debe completar ese campo.

En ese caso, puedes hacer algo como eso:

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

o, si desea un desplazamiento suave en lugar de un desplazamiento instantáneo:

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

Obviamente, puede usar cualquier tipo de vista en lugar de Editar texto. Tenga en cuenta que getBottom () devuelve las coordenadas de la vista en función de su diseño principal, por lo que todas las vistas utilizadas dentro de ScrollView solo deben tener un elemento principal (por ejemplo, un diseño lineal).

Si tiene varios padres dentro del elemento secundario de ScrollView, la única solución que he encontrado es llamar a requestChildFocus en la vista principal:

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

pero en este caso no puedes tener un desplazamiento suave.

Espero que esta respuesta pueda ayudar a alguien con el mismo problema.

Intenta usar el método scrollTo Más información

Si desea desplazarse al instante, puede usar:

 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); } }); 

O si desea desplazarse lenta y suavemente para poder usar esto:

 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(); } 

Lo hice funcionar para desplazarme hasta la parte inferior de una ScrollView (con una vista de texto en el interior):

(Puse esto en un método que actualiza el TextView)

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

Sí tu puedes.

Digamos que tienes un Layout y dentro de eso, tienes muchas Views . Entonces, si desea desplazarse a cualquier View progtwigción, debe escribir el siguiente fragmento de código:

P.ej.

content_main.xml

       

MainActivity.java

 ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView); Button btn = (Button) findViewById(R.id.ivEventBanner); TextView txtView = (TextView) findViewById(R.id.ivEditBannerImage); 

Si desea desplazarse a una View específica digamos txtview en este caso, solo escriba:

 scrollView.smoothScrollTo(txtView.getScrollX(),txtView.getScrollY()); 

Y has terminado. .

Nota: si ya está en un hilo, debe crear un nuevo hilo de publicación, o no se desplazará a una nueva altura larga hasta el final (para mí). Por ejemplo:

 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());*/ } }); } }); } 

Agregando otra respuesta que no involucra coordenadas.

Esto hará que la vista deseada se enfoque (pero no en la posición superior):

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

public void RequestChildFocus (Ver hijo, Vista enfocada)

child – El hijo de este ViewParent que quiere enfocarse. Esta vista contendrá la vista enfocada. No es necesariamente la vista la que realmente tiene foco.

enfocado – La vista que es un descendiente del niño que realmente tiene enfoque

** para desplazarse hasta la altura deseada. He encontrado una buena solución **

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

Estaba usando Runnable con sv.fullScroll (View.FOCUS_DOWN); Funciona perfectamente para el problema inmediato, pero ese método hace que ScrollView tome el Focus de toda la pantalla, si haces que AutoScroll ocurra todo el tiempo, ningún EditText podrá recibir información del usuario, mi solución fue usar un código diferente bajo el ejecutable:

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

haciendo lo mismo sin perder el enfoque en puntos de vista importantes

saludos.

Todos publican respuestas tan complicadas.

Encontré una respuesta fácil, para desplazarme al final, muy bien:

 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() ); 

Y, si es necesario, puede poner la segunda línea de código, arriba, en un ejecutable:

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

Me llevó mucho investigar y jugar para encontrar esta solución simple. ¡Espero que te ayude a ti también! 🙂

solo desplazamiento de la página:

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

me está funcionando

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