studio - scrollview horizontal and vertical android
Cómo desplazar programáticamente un HorizontalScrollView (8)
Tengo un HorizontalScrollView
que contiene un RelativeLayout
. Este diseño está vacío en el XML y se rellena desde java en el onCreate.
Me gustaría que esta vista de desplazamiento esté inicialmente en algún lugar en medio de RelativeLayout
, que es mucho más grande que la pantalla.
Intenté mHorizScrollView.scrollTo(offsetX, 0);
que no funciona No sé qué está mal con esto.
Podría publicar el código, pero no es realmente relevante. Lo que importa es que todo se haga de manera programática (tiene que: s), y que la posición inicial de HorizontalScrollView
se debe establecer mediante programación.
Gracias por leer. Por favor, dígame si necesita más detalles o si esto no es lo suficientemente claro.
Descubrí que si extend
HorizontalScrollView
y anulas el onLayout
, puedes desplazarte limpiamente, después de la súper llamada a onLayout
:
MyScrollView extends HorizontalScrollView {
protected void onLayout (boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
this.scrollTo(wherever, 0);
}
}
EDITAR: Para desplazarse para comenzar o finalizar , puede utilizar:
this.fullScroll(HorizontalScrollView.FOCUS_RIGHT/FOCUS_LEFT);
en lugar de
this.scrollTo(wherever, 0);
El problema es que la vista aún no tiene un tamaño. La forma limpia de hacerlo es implementar el onSizeChanged de ScrollView para enviar un mensaje a un Handler en su actividad para notificar a la actividad que la vista tiene un tamaño y que es posible desplazarse.
La función onSizeChanged debería funcionar. Lo que no comprende es que onSizeChanged debe enviar un mensaje a un controlador de su actividad y no a ninguna función de devolución de llamada, ya que un controlador ejecutará el código en el subproceso de la interfaz de usuario. No puedes hacer operaciones de UI fuera de él. Echa un vistazo a los controladores.
La función scrollTo debería funcionar. ¿Cuál es el layout_width del HSV y la vista dentro de él?
Para probar si es un problema de tiempo (que creo que es), en lugar de llamar a scrollTo () en onStart, llame a postDelayed () con un Runnable que llama a scrollTo, con un retraso de 30 o más.
Un mejor enfoque sería utilizar ViewTreeObserver
para observar diseños.
View interestedInView;
onCreate(){
//Code
//Observe for a layout change
ViewTreeObserver viewTreeObserver = interestedInView.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//REMOVE THE VIEWTREE OBSERVER
//interestedInView is ready for size and position queries because it has been laid out
}
});
}
}
Use view.post y escriba scrollTo (x, y) dentro del método de ejecución. Esta es la forma de invalidar la vista en el método de publicación según el documento de la API de Android.
public void autoSmoothScroll() {
final HorizontalScrollView hsv = (HorizontalScrollView) view.findViewById(R.id.horiscroll);
hsv.postDelayed(new Runnable() {
@Override
public void run() {
//hsv.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
hsv.smoothScrollBy(500, 0);
}
},100);
}