Pregunta ¿Deshabilita el desplazamiento en la vista web?


Hasta ahora solo he sido desarrollador de iPhone y ahora he decidido darle un giro a Android. Algo que no he podido averiguar en Android es cómo prevenir el desplazamiento de forma programática en un WebView?

Algo similar a la prevención de iPhones de onTouchMove evento sería genial!


74
2018-03-27 02:27


origen


Respuestas:


Aquí está mi código para deshabilitando todo el desplazamiento en la vista web:

  // disable scroll on touch
  webview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
  });

Para ocultar las barras de desplazamiento, pero no deshabilitar el desplazamiento:

WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);

o puedes intentar usar diseño de una sola columna pero esto solo funciona con páginas simples e inhabilita el desplazamiento horizontal:

   //Only disabled the horizontal scrolling:
   webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

También puedes intentar envuelva su vista web con scrollview verticalmente desplazable e inhabilita todo el desplazamiento en la vista web:

<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"    >
  <WebView
    android:id="@+id/mywebview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="none" />
</ScrollView>

Y establecer

webview.setScrollContainer(false);

No te olvides de agregar el webview.setOnTouchListener(...) codificar arriba para deshabilitar todo el desplazamiento en la vista web. El ScrollView vertical permitirá el desplazamiento del contenido de WebView.


161
2018-03-11 14:50



No sé si todavía lo necesitas o no, pero aquí está la solución:

appView = (WebView) findViewById(R.id.appView); 
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);

22
2018-02-09 01:25



Haciendo el WebView ignorar los eventos de movimiento es la forma incorrecta de hacerlo. ¿Qué pasa si el WebView necesita escuchar sobre estos eventos?

En cambio, subclase WebView y anula los métodos de desplazamiento no privados.

public class NoScrollWebView extends WebView {
    ...
    @Override
    public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, 
                                int scrollRangeX, int scrollRangeY, int maxOverScrollX, 
                                int maxOverScrollY, boolean isTouchEvent) {
        return false;
    }

    @Override
    public void scrollTo(int x, int y) {
        // Do nothing
    }

    @Override
    public void computeScroll() {
        // Do nothing
    }
}

Si miras el fuente para WebView puedes ver eso onTouchEvent llamadas doDrag que llamadas overScrollBy.


15
2017-09-30 20:15



Agregar los detalles de los márgenes al cuerpo evitará que se desplace si su contenido se ajusta correctamente, así:

<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">

Bastante fácil, y mucho menos errores de código + error :)


12
2018-01-31 15:50



Establezca un oyente en su WebView:

webView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return(event.getAction() == MotionEvent.ACTION_MOVE));
            }
        });

7
2018-04-22 07:09



No lo he intentado ya que aún no me he encontrado con este problema, pero ¿quizás podría anular la función onScroll?

@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}

6
2017-07-08 00:25



Mi solución sucia, pero fácil de implementar y que funciona bien:

Simplemente ponga la vista web dentro de una vista de desplazamiento. Haga que la vista web sea demasiado más grande que el contenido posible (en una o ambas dimensiones, según los requisitos). ..y configure la barra de desplazamiento de la vista de desplazamiento como desee.

Ejemplo para deshabilitar la barra de desplazamiento horizontal en una vista web:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="vertical"
>
    <WebView
        android:id="@+id/mywebview"
        android:layout_width="1000dip"
        android:layout_height="fill_parent"
    />
</ScrollView>

Espero que esto ayude ;)


4
2018-04-16 11:42



Para deshabilitar el desplazamiento, use esto

webView.setOnTouchListener (new View.OnTouchListener () {

        public boolean onTouch(View v, MotionEvent event) {
            return (event.getAction() == MotionEvent.ACTION_MOVE);
        }
    });

3
2017-10-02 04:37



Puede que esta no sea la fuente de su problema, pero he pasado horas tratando de rastrear por qué mi aplicación que funcionó bien en el iPhone hace que el navegador de Android arroje constantemente las barras de desplazamiento vertical / horizontal y realmente mueva la página. Tenía una etiqueta de cuerpo html con alto y ancho establecido en 100%, y el cuerpo estaba lleno de varias etiquetas en diferentes ubicaciones. No importa lo que intenté, los navegadores Android mostraban sus barras de desplazamiento y movían la página solo un poco, en particular cuando se deslizaba rápidamente. La solución que funcionó para mí sin tener que hacer nada en un APK fue agregar lo siguiente a la etiqueta del cuerpo:

leftmargin="0" topmargin="0"

Parece que los márgenes predeterminados para la etiqueta del cuerpo se estaban aplicando en el droide, pero se ignoraron en el iPhone


2
2017-10-25 22:47



Si tu subclase Webview, simplemente puede anular en TouchEvent para filtrar los eventos de movimiento que desencadenan el desplazamiento.

public class SubWebView extends WebView {

    @Override
    public boolean onTouchEvent (MotionEvent ev)    {
        if(ev.getAction() == MotionEvent.ACTION_MOVE) {
            postInvalidate();
            return true;
        }
        return super.onTouchEvent(ev);
    }
    ...

1
2018-03-15 12:59



Resolví el parpadeo y el desplazamiento automático por:

webView.setFocusable(false);
webView.setFocusableInTouchMode(false);

Sin embargo, si todavía no funciona por algún motivo, simplemente cree una clase que extienda WebView y coloque este método en ella:

// disable scroll on touch
  setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
  });

Sugiero extender WebView, para proporcionar un control más efectivo, como inhabilitar / habilitar los deslizamientos, habilitar / deshabilitar toques, oyentes, controlar transiciones, animaciones, definir configuraciones internamente, etc.


1
2018-02-18 11:22