2010-02-09 22 views
14

En mi aplicación tengo una línea para aumentar el ancho de un widget (arrastrando la línea a la derecha/izquierda) y tengo el ScrollView habilitado en la misma actividad. Necesito deshabilitar la acción de vista de desplazamiento cuando el usuario toca la línea y cuando el usuario la suelta, debe estar habilitada. El ScrollView debe estar en estado visible pero la acción de la vista de desplazamiento debe estar deshabilitada. Por favor, ayúdame a resolver este problema. He intentado con estos pero ninguno de ellos está funcionando.Desactivar la acción ScrollView

scroll.setEnabled(false); 
scroll.setFocusable(false); 
scroll.setHorizontalScrollBarEnabled(false); 
scroll.setVerticalScrollBarEnabled(false); 

Gracias de antemano.

Respuesta

5

No estoy seguro de que esto es lo que está pidiendo, pero es posible que tenga que subclasificar ScollView y hacer su propia implementación que puede desactivar el desplazamiento en determinados momentos.

Aquí hay alguien que hizo algo similar, pero para los eventos táctiles, para desactivar el desplazamiento a través de los mismos.

http://osdir.com/ml/AndroidDevelopers/2009-08/msg01099.html

46

Esto podría ser un poco tarde, pero me encontré con el mismo problema así que mi solución es similar a la anterior, tuvo que desactivar la OnTouchListener de la siguiente manera:

// Get the ScrollView 
final ScrollView myScroll = (ScrollView) findViewById(R.id.display_scrollview); 


// Disable Scrolling by setting up an OnTouchListener to do nothing 
myScroll.setOnTouchListener(new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return true; 
    } 
}); 


// Enable Scrolling by removing the OnTouchListner 
tvDisplayScroll.setOnTouchListener(null);  
36

Esto es un poco tarde , pero una forma aún más fácil es obtener su padre ViewGroup y llamar al requestDisallowInterceptTouchEvent(true) en él. Esto hace que no solo el padre inmediato (vista de desplazamiento), sino cualquier otro objeto principal que pueda interceptar el toque, lo ignore durante el evento en particular. Esto es excelente cuando tiene un elemento secundario que se puede arrastrar Y un elemento primario que se puede arrastrar, y desea deshabilitar el arrastre primario mientras se arrastra al elemento secundario.

También es una solución más general que la desactivación específica de la vista de desplazamiento. Si vuelve a utilizar su vista infantil arrastrable en otro lugar, seguirá funcionando: no necesita conocer la ID de la vista de desplazamiento. El código que es reutilizable sin modificaciones siempre es bueno.

+1

Esto es perfecto, gracias! – Jason

+1

Brillante. Puede usar esto en vistas haciendo 'getParent(). RequestDisallowInterceptTouchEvent (...)'. ¡Lo usé en una galería desplazable horizontalmente dentro de ScrollView y funciona perfectamente! – Timmmm

+3

Extrañamente tenía una vista de desplazamiento-> diseño lineal-> mi nuevo control y descubrí que tenía que seleccionar la vista de desplazamiento para llamar a esta solicitudDisallowInterceptTouchEvent (verdadero) antes de que tuviera un efecto de detener el desplazamiento. Creo que los documentos dicen que enviará este mensaje hacia arriba a todos los padres, pero eso no funcionó para mí. – sradforth

0

Si alguien está usando L Android o posterior y primordial onTouch y onInterceptTouchEvent no está funcionando:
intentar anular onStartNestedScroll y return false.

También hay un nuevo atributo XML nestedScrollingEnabled, pero parece que tiene que estar en la vista que tiene una fuga caso de desplazamiento, en lugar de en la ScrollView siendo afectada por la fuga, o en cualquier lugar en la jerarquía de diseño entre ellos. Por lo tanto, si no sabe de antemano qué ScrollViews secundarios podría tener, omitiendo onStartNestedScroll para el ScrollView afectado, es el camino a seguir.