Tengo una actividad muy larga con una vista de desplazamiento. Es un formulario con varios campos que el usuario debe completar. Tengo una casilla de verificación a la mitad de mi formulario, y cuando el usuario lo marca, quiero desplazarme a una parte específica de la vista. ¿Hay alguna forma de desplazarse a un objeto EditText (o cualquier otro objeto de vista) mediante programación?
Además, sé que esto es posible usando las coordenadas X e Y, pero quiero evitar hacerlo, ya que el formulario puede cambiar de un usuario a otro.
android
view
android-edittext
scrollview
programmatically-created
NotACleverMan
fuente
fuente
the form may changed from user to user
pero puedes usarlomEditView.getTop();
Respuestas:
fuente
your_scrollview.post(...
La respuesta de Sherif elKhatib puede mejorarse enormemente si desea desplazar la vista al centro de la vista de desplazamiento . Este método reutilizable desplaza suavemente la vista al centro visible de un HorizontalScrollView.
Para
ScrollView
uso verticalfuente
Esto funciona bien para mi :
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 descendiente de un niño que realmente tiene foco
fuente
En mi opinión, la mejor manera de desplazarse a un rectángulo dado es a través de
View.requestRectangleOnScreen(Rect, Boolean)
. Debe llamarlo en elView
que desea desplazarse y pasar un rectángulo local que desea que sea visible en la pantalla. El segundo parámetro debe serfalse
para un desplazamiento suave ytrue
para un desplazamiento inmediato.fuente
scrollview.smoothScrollTo
no funcionará si la vista requerida está fuera de la pantalla, (probado en el emulador de Android con SDK versión 26)new Handler().post()
?Hice un pequeño método de utilidad basado en la Respuesta de WarrenFaith, este código también tiene en cuenta si esa vista ya está visible en la vista de desplazamiento, no es necesario desplazarse.
fuente
scrollBounds
debería ser el parámetro para elscrollView.getHitRect
método.Debe hacer que su
TextView
solicitud se centre:fuente
Mi EditText estaba anidado en varias capas dentro de mi ScrollView, que en sí mismo no es la vista raíz del diseño. Debido a que getTop () y getBottom () parecían informar las coordenadas dentro de la vista que lo contiene, tuve que calcular la distancia desde la parte superior de ScrollView hasta la parte superior de EditText iterando a través de los padres del EditText.
fuente
Otra variación sería:
o puedes usar el
post()
método.fuente
Sé que esto puede ser demasiado tarde para una mejor respuesta, pero una solución perfecta deseada debe ser un sistema como el posicionador. Quiero decir, cuando el sistema hace un posicionamiento para un campo Editor, coloca el campo justo encima del teclado, por lo que, como reglas UI / UX, es perfecto.
Lo que se muestra a continuación en el código es el posicionamiento de Android sin problemas. En primer lugar, mantenemos el punto de desplazamiento actual como punto de referencia. Lo segundo es encontrar el mejor punto de desplazamiento de posicionamiento para un editor, para hacer esto nos desplazamos hacia arriba, y luego solicitamos los campos del editor para que el componente ScrollView haga el mejor posicionamiento. Gatcha! Hemos aprendido la mejor posición. Ahora, lo que haremos es desplazarnos suavemente desde el punto anterior al punto que hemos encontrado recientemente. Si lo desea, puede omitir el desplazamiento suave utilizando scrollTo en lugar de smoothScrollTo solamente.
NOTA: El contenedor principal ScrollView es un campo miembro llamado scrollViewSignup, porque mi ejemplo era una pantalla de registro, ya que puede descubrir muchas cosas.
Si desea utilizar este bloque para todas las instancias de EditText e integrarlo rápidamente con su código de pantalla. Simplemente puede hacer un recorrido como a continuación. Para hacer esto, hice que el OnFocusChangeListener principal sea un campo miembro llamado focusChangeListenerToScrollEditor , y lo llamo durante onCreate como se muestra a continuación.
Y la implementación del método es la siguiente.
Entonces, lo que hemos hecho aquí es hacer que todos los niños de la instancia de EditText llamen al oyente en foco.
Para llegar a esta solución, revisé todas las soluciones aquí y generé una nueva solución para un mejor resultado UI / UX.
fuente
Las respuestas anteriores funcionarán bien si ScrollView es el padre directo de ChildView. Si su ChildView se está envolviendo en otro ViewGroup en ScrollView, causará un comportamiento inesperado porque View.getTop () obtiene la posición relativa a su padre. En tal caso, debe implementar esto:
fuente
referencia: https://stackoverflow.com/a/6438240/2624806
El seguimiento funcionó mucho mejor.
fuente
Creo que he encontrado una solución más elegante y menos propensa a errores usando
No hay matemática involucrada, y al contrario de otras soluciones propuestas, manejará el desplazamiento correcto tanto hacia arriba como hacia abajo.
Es una buena idea envolverlo
postDelayed
para hacerlo más confiable, en caso de queScrollView
se esté cambiando en este momentofuente
Al examinar el código fuente de Android, se puede encontrar que ya hay una función miembro de
ScrollView
-scrollToChild(View)
- que hace exactamente lo que se solicita. Desafortunadamente, esta función está marcada por alguna oscura razónprivate
. En función de esa función, he escrito la siguiente función que encuentra la primeraScrollView
arriba de laView
especificada como parámetro y la desplaza para que sea visible dentro deScrollView
:fuente
Mi solución es:
fuente
Respondiendo desde mi proyecto práctico.
fuente
En mi caso, eso no es
EditText
, eso esgoogleMap
. Y funciona con éxito así.fuente
Que: ¿Hay alguna manera de desplazar mediante programación una vista de desplazamiento a un texto de edición específico?
Respuesta: La vista de desplazamiento anidada en la vista de reciclaje de la última posición agregó datos de registro.
¿Hay alguna manera de desplazar mediante programación una vista de desplazamiento a un texto de edición específico?
fuente
Lo siguiente es lo que estoy usando:
Esto obtiene la cantidad de desplazamiento necesaria para mostrar la parte inferior de la vista, incluido cualquier margen en la parte inferior de esa vista.
fuente
Desplazamiento vertical, bueno para formas. La respuesta se basa en el desplazamiento horizontal Ahmadalibaloch.
fuente
HorizontalScrollView
en este método?Puedes usar
ObjectAnimator
así:fuente
Según la respuesta de Sherif, lo siguiente funcionó mejor para mi caso de uso. Los cambios notables son en
getTop()
lugar degetBottom()
y ensmoothScrollTo()
lugar descrollTo()
.fuente
Si scrlMain es su NestedScrollView, use lo siguiente,
fuente