Отключить прокрутку в веб-просмотре? - PullRequest
81 голосов
/ 27 марта 2010

До сих пор я был только разработчиком для iPhone, и теперь я решил дать Android вихрь. Что-то, что я не смог понять на Android, это как программно предотвратить прокрутку в WebView?

Было бы замечательно что-то похожее на предотвращение iPhone на мероприятии onTouchMove!

Ответы [ 15 ]

167 голосов
/ 11 марта 2011

Вот мой код для отключения всей прокрутки в веб-просмотре:

  // 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
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(...) выше, чтобы отключить всю прокрутку в веб-просмотре. Вертикальный ScrollView позволит прокручивать содержимое WebView.

22 голосов
/ 09 февраля 2011

Не знаю, нужно ли вам это по-прежнему или нет, но вот решение:

appView = (WebView) findViewById(R.id.appView); 
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);
20 голосов
/ 01 октября 2014

Заставлять 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, что вызывает overScrollBy .

12 голосов
/ 31 января 2012

Добавление сведений о полях к телу предотвратит прокрутку, если ваш контент будет перенесен правильно, например:

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

Достаточно просто, и намного меньше кода + накладные расходы на ошибку:)

7 голосов
/ 22 апреля 2010

Установите слушателя на вашем WebView:

webView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return(event.getAction() == MotionEvent.ACTION_MOVE));
            }
        });
6 голосов
/ 08 июля 2010

Я не пробовал это, так как еще не сталкивался с этой проблемой, но, возможно, вы могли бы перегрузить функцию onScroll?

@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}
4 голосов
/ 16 апреля 2010

Мое грязное, но простое в реализации и хорошо работающее решение:

Просто поместите веб-вид внутри прокрутки. Сделайте веб-просмотр слишком большим, чем возможный контент (в одном или обоих измерениях, в зависимости от требований). ... и настроить полосы прокрутки прокрутки в соответствии с вашими пожеланиями.

Пример отключения горизонтальной полосы прокрутки в веб-просмотре:

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

Надеюсь, это поможет;)

3 голосов
/ 02 октября 2014

Чтобы отключить прокрутку используйте это

webView.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) 
    {
        return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
});
2 голосов
/ 18 февраля 2014

Я разрешил мерцание и автопрокрутку по:

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, чтобы обеспечить более эффективное управление, такое как отключение / включение свайпов, включение / отключение касаний, прослушивателей, переходов управления, анимации, определение настроек внутри и так далее.

2 голосов
/ 26 октября 2011

Возможно, это не источник вашей проблемы, но я потратил часы, пытаясь выяснить, почему мое приложение, работающее нормально на iphone, заставляет браузер Android постоянно отображать вертикальные / горизонтальные полосы прокрутки и фактически перемещать страницу.У меня был HTML-тег тела с высотой и шириной, установленный на 100%, и тело было полно различных тегов в разных местах.Независимо от того, что я пытался, браузеры Android показывали бы свои полосы прокрутки и немного двигали страницу, особенно когда делали быстрый удар.Решение, которое работало для меня без необходимости что-либо делать в APK, заключалось в добавлении следующего к тегу body:

leftmargin="0" topmargin="0"

Кажется, поля по умолчанию для тега body применялись к дроиду, но игнорировалисьiphone

...