88

今まで私は iPhone の開発者だけでしたが、Android を試してみることにしました。Androidで理解できなかったのは、プログラムでスクロールを防ぐ方法WebViewです ?

イベントのiPhoneの防止に似た何かonTouchMoveが素晴らしいでしょう!

4

13 に答える 13

185

これは、 webview ですべてのスクロールを無効にするための私のコードです。

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

スクロールバーを非表示にするだけで、スクロールを無効にするには:

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

または、単一の列のレイアウトを試すこともできますが、これは単純なページでのみ機能し、水平スクロールを無効にします:

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

垂直方向にスクロールする scrollview でwebview をラップし、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>

そしてセット

webview.setScrollContainer(false);

webview.setOnTouchListener(...)上記のコードを追加して、webview のすべてのスクロールを無効にすることを忘れないでください。垂直 ScrollView は、WebView のコンテンツのスクロールを可能にします。

于 2011-03-11T14:50:00.283 に答える
21

モーションWebViewイベントを無視するのは間違った方法です。WebViewこれらのイベントについて聞く必要がある場合はどうすればよいですか?

代わりに、プライベートではないスクロール メソッドをサブクラス化WebViewしてオーバーライドします。

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

ソースを見ると、overScrollByWebViewonTouchEvent呼び出すdoDrag呼び出しがわかります。

于 2014-09-30T20:15:49.830 に答える
20

まだ必要かどうかはわかりませんが、解決策は次のとおりです。

appView = (WebView) findViewById(R.id.appView); 
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);
于 2011-02-09T01:25:55.257 に答える
14

本文に余白の詳細を追加すると、コンテンツが適切に折り返される場合にスクロールが妨げられます。次のようになります。

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

十分に簡単で、コードとバグのオーバーヘッドが大幅に少なくなります:)

于 2012-01-31T15:50:45.283 に答える
9

WebViewにリスナーを設定します。

webView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return(event.getAction() == MotionEvent.ACTION_MOVE));
            }
        });
于 2010-04-22T07:09:44.940 に答える
6

まだこの問題に遭遇していないので試していませんが、おそらく onScroll 関数をオーバーライドできますか?

@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}
于 2010-07-08T00:25:36.210 に答える
4

私の汚いが、実装が簡単でうまく機能するソリューション:

webview を scrollview 内に配置するだけです。WebView を可能なコンテンツよりもはるかに大きくします (要件に応じて、1 つまたは両方のディメンションで)。..スクロールビューのスクロールバーを必要に応じて設定します。

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>

これが役立つことを願っています;)

于 2010-04-16T11:42:31.423 に答える
3

スクロールを無効にするには、これを使用します

webView.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) 
    {
        return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
});
于 2014-10-02T04:37:55.547 に答える
3

ちらつきと自動スクロールを次の方法で解決しました。

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

ただし、何らかの理由でそれでも機能しない場合は、WebView を拡張するクラスを作成し、次のメソッドを配置します。

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

スワイプの無効化/有効化、タッチの有効化/無効化、リスナー、トランジションの制御、アニメーション、内部設定の定義など、より効果的な制御を提供するために、WebView を拡張することをお勧めします。

于 2014-02-18T11:22:06.060 に答える
2

これはあなたの問題の原因ではないかもしれませんが、iPhone で正常に動作するアプリケーションが Android ブラウザで垂直/水平スクロールバーを常にスローし、実際にページを移動させる理由を追跡するのに何時間も費やしました。高さと幅が 100% に設定された html body タグがあり、body はさまざまな場所にさまざまなタグでいっぱいでした。私が何を試しても、Android ブラウザーはスクロール バーを表示し、ページを少しだけ移動します。APKで何もしなくてもうまくいった解決策は、bodyタグに次を追加することでした:

leftmargin="0" topmargin="0"

body タグのデフォルトのマージンがドロイドに適用されていたようですが、iPhone では無視されました。

于 2011-10-25T22:47:12.327 に答える
1

Webviewをサブクラス化すると、単に onTouchEvent をオーバーライドして、スクロールをトリガーする移動イベントを除外できます。

public class SubWebView extends WebView {

    @Override
    public boolean onTouchEvent (MotionEvent ev)    {
        if(ev.getAction() == MotionEvent.ACTION_MOVE) {
            postInvalidate();
            return true;
        }
        return super.onTouchEvent(ev);
    }
    ...
于 2012-03-15T12:59:23.467 に答える
0

上記の答えを研究することは私にとってほとんどうまくいきました...しかし、私はまだ2.1のビューを「投げる」ことができるという問題を抱えていました(2.2と2.3で修正されたようです)。

これが私の最終的な解決策です

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);
}
}
于 2011-03-08T02:31:14.710 に答える