WebViewでスクロールを無効にしますか?
-
22-09-2019 - |
質問
今まで私はiPhone開発者のみでしたが、今ではAndroidに旋回を与えることにしました。 Androidで私が理解できなかったのは、プログラムでスクロールを防ぐ方法です WebView
?
iPhoneの予防に似たもの onTouchMove
イベントは素晴らしいでしょう!
解決
これが私のコードです すべてのスクロールを無効にします 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);
あなたも試すことができます WebViewをラップします ScrollViewを垂直にスクロールし、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ですべてのスクロールを無効にします。 Vertical ScrollViewでは、WebViewのコンテンツをスクロールできます。
他のヒント
あなたがまだそれを必要としているかどうかはわかりませんが、ここに解決策があります:
appView = (WebView) findViewById(R.id.appView);
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);
作る 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
}
}
あなたが見たら ソース 為に WebView
あなたはそれを見ることができます onTouchEvent
電話 doDrag
呼び出します オーバーコルビー.
ボディにマージンの詳細を追加すると、コンテンツが適切にラップされた場合、スクロールが防止されます。
<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
簡単で、コード +バグオーバーヘッドがはるかに少ない:)
WebViewでリスナーを設定します:
webView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return(event.getAction() == MotionEvent.ACTION_MOVE));
}
});
この問題にまだ遭遇していないので、私はこれを試していませんが、おそらくあなたはOnscroll機能をオーバードライブすることができますか?
@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}
私の汚い、しかし実装しやすく、うまく機能するソリューション:
ScrollView内にWebViewを配置するだけです。 WebViewを可能なコンテンツよりも大きすぎて(要件に応じて、一方または両方の寸法)。 ..そして、あなたが望むようにScrollviewのScrollbarをセットアップします。
WebViewで水平スクロールバーを無効にする例:
<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>
これが役立つことを願っています;)
スクロールを無効にするには、これを使用します
webView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event)
{
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
これはあなたの問題の原因ではないかもしれませんが、iPhoneで正常に機能するアプリケーションがAndroidブラウザが垂直/水平スクロールバーを常にスローし、実際にページを移動する理由を追跡しようとして何時間も費やしました。高さと幅が100%に設定されたHTMLボディタグがあり、ボディはさまざまな場所にさまざまなタグでいっぱいでした。何を試しても、Androidブラウザはスクロールバーを表示し、特に高速スワイプを行うときにページを少し移動します。 APKで何もする必要なく私のために働いたソリューションは、ボディタグに次のことを追加することでした。
leftmargin="0" topmargin="0"
ボディタグのデフォルトマージンはドロイドに適用されていたようですが、iPhoneでは無視されています
ちらつきを解決し、次を自動スクロールしました。
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を拡張することをお勧めします。
もし、あんたが サブクラス 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);
}
...
上記の答えを勉強することはほとんど私のためにうまくいきました...しかし、私はまだ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);
}
}
これは完全な答えである必要があります。 @gdangerによって示唆されているように。 WebViewを拡張して、スクロールメソッドをオーバーライドし、レイアウトXML内にカスタムWebViewを埋め込みます。
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();
}
}
}
次に、次のようにレイアウトファイルに埋め込みます
<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"/>
その後、アクティビティでは、スクロールバーを無効にするための追加の方法を使用します。
ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
使用するだけです android:focusableInTouchMode="false"
あなたに WebView.