¿Deshabilita ScrollView Programmatically?

Me gustaría habilitar ScrollView y desactivarlo con un clic de botón.
Deshabilitar significa como si el ScrollView no estuviera allí … y habilitarlo devuelve el ScrollView.
Quiero eso porque tengo una galería con imágenes de texto, y en un botón hago clic en la orientación de la pantalla, así que en Horizontal el texto se hace más grande … Y quiero la vista de desplazamiento para que la imagen no se estire y el texto se vuelva ilegible …
scrollview.Enabled=false / setVisibility(false) doesnt make anything .. xml:

    

Gracias

Edit1: No puedo usar Visibility (gone) ya que eso también escondería la Galería, lo que quiero es ocultar el efecto de la vista de desplazamiento. Cuando hay ScrollView, las imágenes en Gallery se vuelven scrollabale y no caben en la pantalla, así que tienes para desplazarme y ver toda la imagen, no quiero desactivar / habilitar eso en un clic del botón. Intenté esto:

 ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null); ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setHorizontalScrollBarEnabled(false); ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setVerticalScrollBarEnabled(false); ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setEnabled(false); 

Pero aún así, las imágenes en la Galería son desplazables y no se ajustan a la pantalla. ¿Cuál es la solución para esto?

Varios puntos para comenzar:

  1. No puede desactivar el desplazamiento de un ScrollView. Tendría que extender a ScrollView y anular el método onTouchEvent para devolver false cuando se onTouchEvent alguna condición.
  2. El componente Galería se desplaza horizontalmente independientemente de si está o no en un ScrollView: un ScrollView proporciona solo desplazamiento vertical (necesita un HorizontalScrollView para desplazamiento horizontal)
  3. Pareces decir que tienes un problema con el estiramiento de la imagen, esto no tiene nada que ver con ScrollView, puedes cambiar cómo se escala un ImageView con la propiedad android:scaleType (XML) o el método setScaleType , por ejemplo ScaleType.CENTER no estirará su imagen y la centrará en su tamaño original

Puede modificar ScrollView siguiente manera para deshabilitar el desplazamiento

 class LockableScrollView extends ScrollView { ... // true if we can scroll (not locked) // false if we cannot scroll (locked) private boolean mScrollable = true; public void setScrollingEnabled(boolean enabled) { mScrollable = enabled; } public boolean isScrollable() { return mScrollable; } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // if we can scroll pass the event to the superclass return mScrollable && super.onTouchEvent(ev); default: return super.onTouchEvent(ev); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // Don't do anything with intercepted touch events if // we are not scrollable return mScrollable && super.onInterceptTouchEvent(ev); } } 

Entonces usarías

     

en su archivo XML (acaba de cambiar el ScrollView a su especial LockableScrollView ).

Luego llame

 ((LockableScrollView)findViewById(R.id.QuranGalleryScrollView)).setScrollingEnabled(false); 

para deshabilitar el desplazamiento de la vista.

Creo que tiene más que solo el problema de deshabilitar el desplazamiento para lograr el resultado deseado (la galería seguirá siendo desplazable con el código anterior, por ejemplo). Recomiendo investigar un poco más sobre cada uno de los tres componentes (Galería, ScrollView, ImageView) para ver qué propiedades tiene cada una y cómo se comporta.

Yo había ido de esta manera:

  scrollView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return isBlockedScrollView; } }); 

Encontré esta solución simple acaba de establecer

 ScrollView.requestDisallowInterceptTouchEvent(true); 

para empezar, utilicé el código publicado publicado en el primer comentario pero lo cambié así:

  public class LockableScrollView extends ScrollView { public LockableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public LockableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public LockableScrollView(Context context) { super(context); } // true if we can scroll (not locked) // false if we cannot scroll (locked) private boolean mScrollable = true; public void setScrollingEnabled(boolean enabled) { mScrollable = enabled; } public boolean isScrollable() { return mScrollable; } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // if we can scroll pass the event to the superclass if (mScrollable) return super.onTouchEvent(ev); // only continue to handle the touch event if scrolling enabled return mScrollable; // mScrollable is always false at this point default: return super.onTouchEvent(ev); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // if we can scroll pass the event to the superclass if (mScrollable) return super.onInterceptTouchEvent(ev); // only continue to handle the touch event if scrolling enabled return mScrollable; // mScrollable is always false at this point default: return super.onInterceptTouchEvent(ev); } } } 

entonces lo llamé por este camino

 ((LockableScrollView)findViewById(R.id.scrollV)).setScrollingEnabled(false); 

porque lo intenté

 ((LockableScrollView)findViewById(R.id.scrollV)).setIsScrollable(false); 

pero dijo que setIsScrollable no está definido

Espero que esto ayude

Disablend ScrollView

 ScrollView sw = (ScrollView) findViewById(R.id.scrollView1); sw.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); 

Aquí hay una solución más simple. onTouch() para ScrollView OnTouchListener y devuelva falso si desea omitir el desplazamiento mediante el tacto. El desplazamiento programático todavía funciona y no es necesario ampliar la clase ScrollView .

 mScroller.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return isScrollable; } }); 

No tengo suficientes puntos para comentar sobre una respuesta, pero quería decir que la respuesta de mikec funcionó para mí, ¡excepto que tuve que cambiarla para volver! Es tan fácil de descifrar:

 mScroller.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return !isScrollable; } }); 
 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // if we can scroll pass the event to the superclass if (mScrollable) return super.onInterceptTouchEvent(ev); // only continue to handle the touch event if scrolling enabled return mScrollable; // mScrollable is always false at this point default: return super.onInterceptTouchEvent(ev); } } 

@JosephEarl +1 Tiene una gran solución aquí que funcionó perfectamente para mí con algunas modificaciones menores para hacerlo programáticamente.


Estos son los cambios menores que hice:

Clase LockableScrollView:

 public boolean setScrollingEnabled(boolean enabled) { mScrollable = enabled; return mScrollable; } 

Actividad principal:

 LockableScrollView sv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sv = new LockableScrollView(this); sv.setScrollingEnabled(false); } 

Tenía un diseño sobre NestedScrollView que consumía el evento táctil y deshabilitaba el desplazamiento:

 progressBarLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return true; } }); 

y para habilitar:

 progressBarLayout.setOnTouchListener(null); 
 public class LockableScrollView extends ScrollView { private boolean mScrollable = true; public LockableScrollView(Context context) { super(context); } public LockableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public void setScrollable(boolean enabled) { mScrollable = enabled; } public boolean isScrollable() { return mScrollable; } @Override public boolean onTouchEvent(MotionEvent ev) { return mScrollable && super.onTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mScrollable && super.onInterceptTouchEvent(ev); } } 

¿Esto ayuda?

 ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null); 

Puede ampliar la galería y usar alguna bandera para deshabilitar el desplazamiento cuando lo desee:

 public class MyGallery extends Gallery { public boolean canScroll; public MyGallery(Context context, AttributeSet attrs) { canScroll = true; super(context, attrs); } public void setCanScroll(boolean flag) { canScroll = flag; } @Override public boolean onScroll(android.view.MotionEvent e1, android.view.MotionEvent e2, float distanceX, float distanceY) { if (canScroll) return super.onScroll(e1,e2,distancex,distancey); else return false; } @Override public boolean onSingleTapUp(MotionEvent e) { if (canScroll) return super.onSingleTapUp(ey); else return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (canScroll) return super.onFling(e1,e2,velocityX,velocityY); else return false; } } 

Puede crear CustomScrollView, para lo cual puede desactivar su interferencia con otras vistas. Aunque esto puede ser a veces irritante para el usuario final. Úselo con precaución.

Este es el código:

 import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewParent; public class CustomScrollView extends android.widget.ScrollView { public CustomScrollView(Context context) { super(context); } public CustomScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* Prevent parent controls from stealing our events once we've gotten a touch down */ if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { ViewParent p = getParent(); if (p != null) p.requestDisallowInterceptTouchEvent(true); } return false; } } 

¿Cómo usar CustomScrollView?

Puede agregar CustomScrollView como elemento principal a la pantalla en la que desea agregar otra vista de desplazamiento como vista secundaria, y toda la pantalla es desplazable. Lo usé para un RelativeLayout.

  <**package.**CustomScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/some_id" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:tools="http://schemas.android.com/tools">  #**Inside this I had a TableLayout and TableRow. Inside the TableRow,** #**I had a TextView which I made scrollable from Java Code.** #**textView.setMovementMethod(new ScrollingMovementMethod());**   

Funcionó para mi caso.

Como puede ver en la documentación , no puede establecer la visibilidad en falso. En tu caso, probablemente deberías usar:

 scrollview.setVisibility(Visibility.GONE); 

en el botón clic oyente simplemente haz

 ScrollView sView = (ScrollView)findViewById(R.id.ScrollView01); sView.setVerticalScrollBarEnabled(false); sView.setHorizontalScrollBarEnabled(false); 

para que la barra de desplazamiento no esté habilitada al hacer clic en el botón