oreo - android pie
¿Deshabilita ScrollView Programmatically? (16)
¿Esto ayuda?
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);
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:
<ScrollView
android:id="@+id/QuranGalleryScrollView"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<Gallery android:id="@+id/Gallery"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="horizontal"></Gallery>
</ScrollView>
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?
@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);
}
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;
}
});
Como puede ver en la documentation , no puede establecer la visibilidad en falso. En tu caso, probablemente deberías usar:
scrollview.setVisibility(Visibility.GONE);
Encontré esta solución simple acaba de establecer
ScrollView.requestDisallowInterceptTouchEvent(true);
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;
}
});
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.
<?xml version="1.0" encoding="utf-8"?>
<**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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
#**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());**
</RelativeLayout>
</ankit.inventory.ankitarora.inventorymanagementsimple.CustomScrollView>
Funcionó para mi caso.
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);
Varios puntos para comenzar:
- No puede desactivar el desplazamiento de un ScrollView. Tendría que extender a ScrollView y anular el método
onTouchEvent
para devolverfalse
cuando seonTouchEvent
alguna condición. - 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)
- 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étodosetScaleType
, por ejemploScaleType.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
<com.mypackagename.LockableScrollView
android:id="@+id/QuranGalleryScrollView"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<Gallery android:id="@+id/Gallery"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="horizontal">
</Gallery>
</com.mypackagename.LockableScrollView>
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;
}
});
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
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;
}
});
@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);
}
}
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);
}
}