Frage

Bis jetzt war ich nur iPhone -Entwickler und jetzt habe ich mich entschlossen, Android einen Wirbel zu geben. Etwas, das ich nicht auf Android herausfinden konnte WebView?

Etwas Ähnliches wie die iPhones -Verhinderung der onTouchMove Veranstaltung wäre großartig!

War es hilfreich?

Lösung

Hier ist mein Code für Alle Scrollen deaktivieren In WebView:

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

Nur die Bildlaufleisten auszublenden, aber nicht das Scrollen deaktivieren:

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

Oder Sie können versuchen, es zu verwenden Einzelspaltenlayout Dies funktioniert jedoch nur mit einfachen Seiten und deaktiviert das horizontale Scrollen:

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

Sie können es auch versuchen Wickeln Sie Ihre Webview ein Mit vertikalem Scrolling Scrollview und deaktivieren Sie alle Scrollen im WebView:

<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>

Und set

webview.setScrollContainer(false);

Vergessen Sie nicht, das hinzuzufügen webview.setOnTouchListener(...) Code oben, um alle Scrollen im WebView zu deaktivieren. Die vertikale ScrollView ermöglicht das Scrollen des Inhalts von WebView.

Andere Tipps

Ich weiß nicht, ob Sie es noch brauchen oder nicht, aber hier ist die Lösung:

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

Das machen WebView Bewegungsereignisse zu ignorieren, ist der falsche Weg. Was ist, wenn das WebView Muss über diese Ereignisse hören?

Stattdessen Unterklasse WebView und überschreiben Sie die nicht privaten Schriftrollenmethoden.

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
    }
}

Wenn Sie sich das ansehen Quelle zum WebView Sie können sehen, dass onTouchEvent Anrufe doDrag welche ruft Überreinigen.

Das Hinzufügen der Randdetails zum Körper verhindert das Scrollen, wenn Ihr Inhalt ordnungsgemäß einhüllt, wie dies:

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

Einfach genug und viel weniger Code + Fehler Overhead :)

Legen Sie einen Hörer in Ihrem Webview fest:

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

Ich habe das nicht versucht, da ich dieses Problem noch nicht begegnen habe, aber vielleicht könnten Sie die ONSCROLL -Funktion überlegen?

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

Meine schmutzige, aber leicht zu implementierende und gut funktionierende Lösung:

Setzen Sie einfach das Webview in eine Scrollview ein. Machen Sie das WebView viel zu größer als der mögliche Inhalt (in einer oder beiden Abmessungen, abhängig von den Anforderungen). ..und und richten Sie die Bildlaufleiste des Scrollview so ein, wie Sie möchten.

Beispiel, um die horizontale Scrollbar in einem Webview zu deaktivieren:

<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>

Ich hoffe das hilft ;)

Um Scroll zu deaktivieren, verwenden Sie dies

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

Dies ist vielleicht nicht die Quelle Ihres Problems, aber ich habe stundenlang versucht, herauszufinden, warum meine Anwendung, die auf dem iPhone gut funktioniert hat, dazu führt, dass der Android -Browser die vertikalen/horizontalen Bildlaufleisten ständig aufwirft und die Seite tatsächlich verschiebt. Ich hatte ein HTML -Körper -Tag mit Höhe und Breite auf 100%, und der Körper war an verschiedenen Orten voll von verschiedenen Tags. Egal was ich ausprobiert habe, die Android -Browser zeigten ihre Bildlaufleisten und bewegen die Seite nur ein wenig, besonders wenn sie schnell streichen. Die Lösung, die für mich funktioniert hat, ohne etwas in einer APK tun zu müssen, war, dem Body -Tag Folgendes hinzuzufügen:

leftmargin="0" topmargin="0"

Es scheint

Ich habe das Flicker und die Auto-Scroll durch:

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

Wenn es jedoch aus irgendeinem Grund immer noch nicht funktioniert, machen Sie einfach eine Klasse, die WebView erweitert, und setzen Sie diese Methode darauf ein:

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

Ich schlage vor, WebView zu erweitern, um eine effektivere Kontrolle zu gewährleisten, z. B. Deaktivieren/Aktivieren von Swipes, Aktivieren/Deaktivieren von Berührungen, Hörern, Steuerungsübergängen, Animationen, interne Einstellungen in internem Definieren.

Wenn du Unterklasse WebView können Sie einfach übertreffen, um die Move-Events herauszufiltern, die das Scrollen auslösen.

public class SubWebView extends WebView {

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

Das Studium der oben genannten Antworten funktionierte fast für mich ... aber ich hatte immer noch ein Problem, dass ich die Aussicht auf 2.1 schleudern konnte (schien mit 2,2 & 2,3 behoben zu sein).

Hier ist meine endgültige Lösung

public class MyWebView extends WebView
{
private boolean bAllowScroll = true;
@SuppressWarnings("unused") // it is used, just java is dumb
private long downtime;

public MyWebView(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

public void setAllowScroll(int allowScroll)
{
    bAllowScroll = allowScroll!=0;
    if (!bAllowScroll)
        super.scrollTo(0,0);
    setHorizontalScrollBarEnabled(bAllowScroll);
    setVerticalScrollBarEnabled(bAllowScroll);
}

@Override
public boolean onTouchEvent(MotionEvent ev) 
{
    switch (ev.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        if (!bAllowScroll)
            downtime = ev.getEventTime();
        break;
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
        if (!bAllowScroll)
        {
            try {
                Field fmNumSamples = ev.getClass().getDeclaredField("mNumSamples");
                fmNumSamples.setAccessible(true);
                Field fmTimeSamples = ev.getClass().getDeclaredField("mTimeSamples");
                fmTimeSamples.setAccessible(true);
                long newTimeSamples[] = new long[fmNumSamples.getInt(ev)];
                newTimeSamples[0] = ev.getEventTime()+250;
                fmTimeSamples.set(ev,newTimeSamples);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        break;
    }
    return super.onTouchEvent(ev);
}

@Override
public void flingScroll(int vx, int vy)
{
    if (bAllowScroll)
        super.flingScroll(vx,vy);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
    if (bAllowScroll)
        super.onScrollChanged(l, t, oldl, oldt);
    else if (l!=0 || t!=0)
        super.scrollTo(0,0);
}

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

@Override
public void scrollBy(int x, int y)
{
    if (bAllowScroll)
        super.scrollBy(x,y);
}
}

Dies sollte die vollständige Antwort sein. Wie von @gdanger vorgeschlagen. Erweitern Sie WebView, um die Bildlaufmethoden zu überschreiben und die benutzerdefinierte WebView in Layout XML einzubetten.

public class ScrollDisabledWebView extends WebView {

    private boolean scrollEnabled = false;

    public ScrollDisabledWebView(Context context) {
        super(context);
        initView(context);
    }

    public ScrollDisabledWebView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        initView(context);
    }
    // this is important. Otherwise it throws Binary Inflate Exception.
    private void initView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
                                   int scrollRangeX, int scrollRangeY, int maxOverScrollX,
                                   int maxOverScrollY, boolean isTouchEvent) {
        if (scrollEnabled) {
            return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
        }
        return false;
    }

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

    @Override
    public void computeScroll() {
        if (scrollEnabled) {
            super.computeScroll();
        }
    }
}

Und dann wie folgt in Layoutdatei einbetten

<com.sample.apps.ScrollDisabledWebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    tools:context="com.sample.apps.HomeActivity"/>

Verwenden Sie dann in der Aktivität auch einige zusätzliche Methoden zum Deaktivieren von Scrollbarnen.

ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);

Benutz einfach android:focusableInTouchMode="false" auf Ihrem Webview.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top