Voici mon code pour désactiver tout le défilement dans la vue Web:
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
Pour masquer uniquement les barres de défilement, mais pas désactiver le défilement:
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
ou vous pouvez essayer d'utiliser la disposition à une seule colonne, mais cela ne fonctionne qu'avec des pages simples et cela désactive le défilement horizontal:
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
Vous pouvez également essayer d' encapsuler votre vue Web avec une vue de défilement à défilement vertical et désactiver tout le défilement sur la vue 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>
Et mettre
webview.setScrollContainer(false);
N'oubliez pas d'ajouter le webview.setOnTouchListener(...)
code ci-dessus pour désactiver tout le défilement dans la vue Web. Le ScrollView vertical permettra de faire défiler le contenu de la WebView.
MotionEvent.ACTION_MOVE
événements dans votreWebView
voir ma réponse ci-dessous.ACTION_MOVE
sur l'setOnTouchListener
événement a des effets secondaires , donc je ne recommanderais pas cette réponse; 1. Les balayages rapides sont comptés comme desonclick
événements sur la page. 2. Empêche le défilement excessif des éléments sur la page, cela peut être nécessaire pour une interaction appropriée selon le site. 3. L'touchmove
événement JS . @GDanger a la bonne réponse qui remplace leoverScrollBy
en étendant leWebView
car il n'a aucun effet secondaire, empêche simplement le défilement de la page. stackoverflow.com/a/26129301/1244574Je ne sais pas si vous en avez encore besoin ou non, mais voici la solution:
appView = (WebView) findViewById(R.id.appView); appView.setVerticalScrollBarEnabled(false); appView.setHorizontalScrollBarEnabled(false);
la source
Faire
WebView
ignorer les événements de mouvement n'est pas la bonne façon de procéder. Et si leWebView
besoin d'entendre parler de ces événements?Au lieu de cela, sous
WebView
-classez et remplacez les méthodes de défilement non privées.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 vous regardez la source de pour
WebView
vous pouvez voir que lesonTouchEvent
appelsdoDrag
qui appelle overScrollBy .la source
L'ajout des détails de la marge au corps empêchera le défilement si votre contenu s'emballe correctement, comme suit:
<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
Assez facile, et beaucoup moins de code + de surcharge de bogue :)
la source
Définissez un écouteur sur votre WebView:
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return(event.getAction() == MotionEvent.ACTION_MOVE)); } });
la source
return
ligne. Cela interrompt également les événements tactiles HTML5 et JavaScript.event.getAction() != MotionEvent.ACTION_MOVE
aussi bien quereturn true
return false
pasreturn true
.Je n'ai pas essayé cela car je n'ai pas encore rencontré ce problème, mais vous pourriez peut-être surcharger la fonction onScroll?
@Override public void scrollTo(int x, int y){ super.scrollTo(0,y); }
la source
Ma solution sale, mais facile à mettre en œuvre et qui fonctionne bien:
Mettez simplement la vue Web dans une vue de défilement. Faites en sorte que la vue Web soit beaucoup trop grande que le contenu possible (dans une ou les deux dimensions, selon les exigences). ..et configurez les barres de défilement de la vue de défilement comme vous le souhaitez.
Exemple de désactivation de la barre de défilement horizontale sur une vue 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>
J'espère que ça aide ;)
la source
J'ai résolu le scintillement et le défilement automatique en:
webView.setFocusable(false); webView.setFocusableInTouchMode(false);
Cependant, si cela ne fonctionne toujours pas pour une raison quelconque, créez simplement une classe qui étend WebView et mettez cette méthode dessus:
// disable scroll on touch setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
Je suggère d'étendre WebView, afin de fournir un contrôle plus efficace, comme désactiver / activer les balayages, activer / désactiver les touches, les écouteurs, contrôler les transitions, les animations, définir les paramètres en interne, etc.
la source
Pour désactiver le défilement, utilisez ceci
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
la source
Ce n'est peut-être pas la source de votre problème, mais j'ai passé des heures à essayer de comprendre pourquoi mon application qui fonctionnait bien sur l'iphone faisait que le navigateur Android lançait constamment les barres de défilement verticales / horizontales et déplaçait réellement la page. J'avais une balise de corps html avec une hauteur et une largeur réglées à 100%, et le corps était plein de diverses balises à différents endroits. Peu importe ce que j'ai essayé, les navigateurs Android afficheraient leurs barres de défilement et déplaceraient un peu la page, en particulier lors d'un balayage rapide. La solution qui a fonctionné pour moi sans avoir à faire quoi que ce soit dans un APK était d'ajouter ce qui suit à la balise body:
leftmargin="0" topmargin="0"
Il semble que les marges par défaut pour la balise corporelle étaient appliquées sur le droïde mais ignorées sur l'iphone
la source
Si vous sous- classez Webview, vous pouvez simplement remplacer onTouchEvent pour filtrer les événements de déplacement qui déclenchent le défilement.
public class SubWebView extends WebView { @Override public boolean onTouchEvent (MotionEvent ev) { if(ev.getAction() == MotionEvent.ACTION_MOVE) { postInvalidate(); return true; } return super.onTouchEvent(ev); } ...
la source
étudier les réponses ci-dessus a presque fonctionné pour moi ... mais j'avais toujours un problème en ce que je pouvais «lancer» la vue sur 2.1 (semblait être corrigé avec 2.2 et 2.3).
voici ma solution finale
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); } }
la source
Cela devrait être la réponse complète. Comme suggéré par @GDanger. Étendez WebView pour remplacer les méthodes de défilement et incorporer la vue Web personnalisée dans le format xml.
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(); } } }
Et puis incorporer dans le fichier de mise en page comme suit
<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"/>
Ensuite, dans l'activité, utilisez également des méthodes supplémentaires pour désactiver les barres de défilement.
ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView); webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false);
la source
Utilisez simplement
android:focusableInTouchMode="false"
sur votre webView .la source