studio programacion herramientas fundamentos con avanzado aplicaciones android android-scrollview

programacion - manual de android en pdf



Android: ScrollView fuerza a la parte inferior (10)

A veces scrollView.post no funciona

scrollView.post(new Runnable() { @Override public void run() { scrollView.fullScroll(ScrollView.FOCUS_DOWN); } });

PERO si usas scrollView.postDelayed, definitivamente funcionará

scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView.fullScroll(ScrollView.FOCUS_DOWN); } },1000);

Me gustaría que ScrollView comience desde abajo. ¿Algún método?


Cuando la vista aún no está cargada, no puede desplazarse. Puede hacerlo ''más tarde'' con una llamada de correo o de espera como se indica arriba, pero esto no es muy elegante.

Es mejor planificar el desplazamiento y hacerlo en el siguiente en Layout (). Código de ejemplo aquí:

https://.com/a/10209457/1310343


Lo que funcionó mejor para mí es

scroll_view.post(new Runnable() { @Override public void run() { // This method works but animates the scrolling // which looks weird on first load // scroll_view.fullScroll(View.FOCUS_DOWN); // This method works even better because there are no animations. scroll_view.scrollTo(0, scroll_view.getBottom()); } });


Me incremento para trabajar perfectamente.

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

Nota

Esta respuesta es una solución alternativa para las versiones realmente antiguas de Android. Hoy el postDelayed no tiene más ese error y deberías usarlo.


No era exactamente la respuesta a la pregunta, pero necesitaba desplazarme hacia abajo tan pronto como EditText obtuviera el foco. Sin embargo, la respuesta aceptada haría que ET también pierda el enfoque de inmediato (para el ScrollView supongo).

Mi solución fue la siguiente:

emailEt.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ Toast.makeText(getActivity(), "got the focus", Toast.LENGTH_LONG).show(); scrollView.postDelayed(new Runnable() { @Override public void run() { scrollView.fullScroll(ScrollView.FOCUS_DOWN); } }, 200); }else { Toast.makeText(getActivity(), "lost the focus", Toast.LENGTH_LONG).show(); } } });


Una cosa a considerar es qué NO establecer. Asegúrese de que los controles de su hijo, especialmente los controles EditText, no tengan configurada la propiedad RequestFocus. Esta puede ser una de las últimas propiedades interpretadas en el diseño y anulará la configuración de gravedad en sus padres (el diseño o ScrollView).


Usar otra forma genial de hacer esto con corotines de Kotlin. La ventaja de utilizar una coroutine opuesta a un controlador con un ejecutable (post / postdelayado) es que no activa un hilo costoso para ejecutar una acción retrasada.

launch(UI){ delay(300) scrollView.fullScroll(View.FOCUS_DOWN) }

Es importante especificar el HandlerContext de la coroneta como interfaz de usuario, de lo contrario, es posible que la acción retrasada no se invoque desde la secuencia de la interfaz de usuario.


debe ejecutar el código dentro de scroll.post de esta manera:

scroll.post(new Runnable() { @Override public void run() { scroll.fullScroll(View.FOCUS_DOWN); } });


scroll.fullScroll(View.FOCUS_DOWN) conducirá al cambio de enfoque. Eso traerá un comportamiento extraño cuando hay más de una vista enfocable, por ejemplo, dos EditText. Hay otra manera para esta pregunta.

View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1); int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom(); int sy = scrollLayout.getScrollY(); int sh = scrollLayout.getHeight(); int delta = bottom - (sy + sh); scrollLayout.smoothScrollBy(0, delta);

Esto funciona bien


scroll.fullScroll(View.FOCUS_DOWN) también debería funcionar.