2010-10-30 19 views
9

He estado un par de días tratando de resolver esto pero no puedo resolverlo. El problema es una actividad simple, con un diseño simple, ScrollView -> LinearLayout -> y muchos botones dentro del diseño (dentro del contenido de desplazamiento). Todo funciona bien, pero una cosa complicada. Cuando hago clic en un botón, digamos en la parte superior del contenido de desplazamiento e inmediatamente me desplazo hacia abajo hasta el final del contenido y hago clic en otro botón. No pasa nada hasta que hago clic por segunda vez y todo vuelve a la normalidad. Esto se puede reproducir en cualquier momento y es independiente del código (he probado más de 20 escenarios). Todavía no tengo mucha experiencia en Android, pero parece que el oyente de desplazamiento detiene el oyente OnClick o algo así. Cualquier ayuda con esto sería muy apreciada. Gracias de antemano.ScrollView con botones dentro, sin respuesta hasta que haga clic dos veces en cualquier botón dentro de

PD. Si programáticamente hago un scrollTo(), en lugar del desplazamiento manual con los dedos, todo funciona bien y el clic responde al primer toque. Simplemente me está abrumando.

+0

@esenian: cree un proyecto de muestra que demuestre el problema. Cargue ese proyecto en algún lugar (por ejemplo, como un archivo ZIP). Publique un enlace a eso aquí, en un comentario con el prefijo @CommonsWare, así sé que lo publicó. – CommonsWare

+0

@CommonsWare He subido un proyecto aquí http://www.megaupload.com/?d=U69RRBAW Realmente simple, diseño, sin acciones, solo presione el Botón 1, desplácese hacia abajo y presione el Botón 14. Verá a qué me refiero (sin marco naranja en el botón hasta el segundo clic). Muchas gracias por tu tiempo. – esenian

+0

@esenian: MegaUpload dice que el archivo no está disponible. Tal vez sea suficiente publicar su fuente Java de clase de actividad y el archivo XML de disposición (si hay alguno), ya sea editando su pregunta o tal vez mediante el uso de http://gist.github.com o servicios "pastebin" similares. – CommonsWare

Respuesta

2

Todo se comporta con normalidad.

Cuando comience a desplazarse, ScrollView solicitará eventos táctiles hasta que deje de tocar la pantalla durante un momento. En Android 2.2, sabrá cuándo se considera que el desplazamiento completo, porque la barra de desplazamiento de la derecha se desvanecerá.

+0

Ok, entiendo lo que quieres decir. Por lo tanto, supongo que no hay ninguna opción para reducir el tiempo mientras scrollview está clamando eventos táctiles una vez que deja de desplazarse (al menos visualmente) ...? Sé que no es mucho el tiempo, tal vez 0,5 segundos, pero sigue siendo molesto. Si hubiera una manera, sería genial. De todos modos muchas gracias por tu respuesta. – esenian

+0

@esenian: "Por lo tanto, supongo que no hay ninguna opción para reducir el tiempo, mientras que la vista de desplazamiento clamea los eventos táctiles una vez que deja de desplazarse (al menos de forma visual) ...?" -- no que yo sepa. Tenga en cuenta que un 'ScrollView' de una lista de' Botones' no es una técnica que verá usar muchas aplicaciones de producción. – CommonsWare

+0

Claro que tienes razón y de nuevo gracias, pensé que este era el enfoque para la nueva aplicación de YouTube de Google. Parece tener una vista de desplazamiento horizontal llena de botones que simulan "pestañas de desplazamiento". Lo he hecho funcionar y se ve más o menos igual, pero el problema con el "click lag" fue molesto. Ahora veo que la aplicación en sí también tiene el mismo comportamiento lento con esto, por lo que mi enfoque debe ser bastante cercano. Es bueno en mi opinión. Trataré de ver el código de desplazamiento para ver si puedo anular los controles esta vez. Realmente gracias, hombre. – esenian

3

Tengo el mismo problema. No estoy de acuerdo con que se trate de un problema de la barra de desplazamiento. Si deshabilita el desvanecimiento, sucede lo mismo.

varios enfoques juzgado en themes.xml:

<item name="android:scrollbarDefaultDelayBeforeFade">100</item> 
<item name="android:scrollbarFadeDuration">100</item> 
<item name="android:fadeScrollbars">true</item> 

Pero nada ayudó. Parece que es algo del sistema con scrollViews. Esto podría ayudar a ver lo que está pasando:

setOnScrollListener(new OnScrollListener(){ 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
    } 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // TODO Auto-generated method stub 
     if(scrollState == 0) Log.i("a", "scrolling stopped..."); 
    } 
    }); 
} 

Pero eso (por desgracia) no ayuda a superar el problema - sino explicarla.

NOTA: esto solo ocurre si utiliza ScrollView. ListView no tiene este problema.

¿Alguien tiene otra idea?

+0

Quizás hayas encontrado una solución para esto? Parece que está relacionado con la aceleración de desplazamiento (una acción de deslizamiento más dura dará como resultado un mayor retraso incluso si el desplazamiento se detiene inmediatamente en la parte superior/inferior), pero no tengo idea de cómo solucionarlo. – sniurkst

0

He podido solucionar esto sobrescribiendo onScrollChanged, luego enviando ScrollView a MotionEvent mediante OnTouchEvent cuando se alcanzan los límites para simular un toque de usuario.

Es la programación más intrincada y sucia que puedo imaginar, pero funciona bien en mi aplicación. Esta aplicación es para teléfonos que solo ejecutan 2.2, y este error se debe corregir de alguna manera.

Si alguien tiene una mejor solución, por favor avíseme.

Editar: Este problema está solo en 2.2 por cierto, lo arreglaron en 2.3, y no fue un problema en 2.1.

1

Tengo una situación como esta. Tengo una ExpandableListView, simplemente se comporta normalmente. Cuando gire el teléfono celular a horizontal y gire hacia atrás, algunos elementos en un grupo de ExpandableListView no responderán por un evento de clic. A menos que recorra la vista de lista o haga clic en el elemento de grupo de estos elementos, el evento se enviará a los elementos en los que hice clic previamente y realizará los códigos de escucha de clic correctamente.

Esto sucedió tanto en Android 2.3 y 4.0 ...

Cuestiones relacionadas