WebView бесконечно расширяется — как этого можно избежать?

Я использую веб-просмотр в своем приложении для Android, однако после завершения загрузки, которое я могу обнаружить с помощью onPageFinished (WebView webview, String url), страница продолжает бесконечно расти в высоту.

Как я могу предотвратить это?

Вот что я делаю.

  1. У меня есть общий шаблон страницы, который содержит ScrollView. Ширина и высота устанавливаются в соответствии с родителем. Внутри ScrollView есть несколько общих элементов для всех действий, которые я создаю. Один из них — LinearLayout, куда я вставляю весь пользовательский контент.

    .....
    <ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:layout_margin="0dp"
    android:padding="0dp"
    android:scrollbars="none"
    >
    
    ......
    
    <LinearLayout 
            android:id="@+id/content"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="0dp"
            android:padding="0dp"
            android:orientation="vertical">
    
            //EVERY USER CONTENT GOES HERE    
    
    </LinearLayout>
    
    
    ......
    
    </ScrollView>
    

    .....

  2. В данном конкретном случае контент представляет собой веб-страницу, которая загружает карты Google с помощью мобильного веб-API. Вот файл макета

    <?xml version="1.0" encoding="utf-8"?>
    
      <WebView
           android:id="@+id/maps"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_centerInParent="true"
           android:layout_margin="0dp"
           android:padding="0dp"
      />
    
  3. Вот код моей активности, который инициализирует веб-просмотр

    .... WebView wv = (WebView)this.content.findViewById(R.id.maps);

    WebSettings ws = wv.getSettings();

    ws.setPluginState(PluginState.ON);
    ws.setSupportZoom(false);
    ws.setLightTouchEnabled(true);
    ws.setDomStorageEnabled(true);
    ws.setAppCacheMaxSize(1024 * 1024 * 8);
    ws.setAppCachePath(context.getCacheDir().getAbsolutePath());
    ws.setAppCacheEnabled(true);
    ws.setAllowFileAccess(true);
    ws.setCacheMode(WebSettings.LOAD_NORMAL);
    ws.setJavaScriptEnabled(true);
    
    wv.setInitialScale(0);
    wv.addJavascriptInterface(new Object(), "Android");
    wv.setKeepScreenOn(true);
    
  4. Наконец, когда я загружаю карты через wv.loadUrl("........");

после завершения загрузки страницы я получаю следующие журналы, и веб-просмотр растет в бесконечном цикле

02-18 14:16:06.195: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.394: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.480: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.527: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.582: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.632: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.683: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.734: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.785: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.875: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:06.957: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.058: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.332: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.398: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.449: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.496: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.554: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.605: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.652: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.707: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.742: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.792: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.839: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.902: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:07.949: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.015: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.066: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.113: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.164: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.214: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.250: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.300: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.335: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.386: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.437: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.484: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.531: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.566: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.613: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.667: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.714: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.750: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.847: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.902: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:08.949: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.003: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.035: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.085: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.121: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.167: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.218: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.253: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.304: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.367: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.417: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.476: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.523: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.585: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.632: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.664: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.710: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.765: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.812: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.863: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.894: VERBOSE/webview(10904): OnSizeChanged: Enter
02-18 14:16:09.957: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:09.992: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.042: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.097: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.148: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.179: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.226: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.277: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.328: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.378: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.410: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.460: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.511: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.546: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.597: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.648: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.679: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.730: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.781: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.835: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.886: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.925: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:10.976: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.011: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.066: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.125: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.183: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.214: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.265: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.320: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.371: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.402: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.453: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.507: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.558: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.589: VERBOSE/webview(10904): OnSizeChanged: Enter 
02-18 14:16:11.644: VERBOSE/webview(10904): OnSizeChanged: Enter 
.......... This goes on ...........

Я заметил, что это происходит, когда страница содержит jQuery. Но эта же страница нормально загружается в стандартном браузере.

Любая идея, почему это происходит, и как это можно исправить?

Любая значимая помощь приветствуется... Спасибо.


person Nar Gar    schedule 18.02.2012    source источник


Ответы (3)


Это поздний ответ, но, надеюсь, он кому-то поможет. У меня возникла та же проблема, и виновником был этот базовый CSS:

body {
    width: 100%;    
    height: 100%;
}

Это изменение устраняет проблему:

body {
    width: 100%;    
    height: auto;
}
person Nachi    schedule 23.09.2013

Этот пост в блоге решил мою проблему. Я думаю, это поможет. http://capdroid.wordpress.com/2014/08/07/resizing-webview-to-match-the-content-size/

    private void setupWebView() {
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            webView.loadUrl("javascript:MyApp.resize(document.body.getBoundingClientRect().height)");
            super.onPageFinished(view, url);
        }
    });
    webView.addJavascriptInterface(this, "MyApp");
}

@JavascriptInterface
public void resize(final float height) {
    MyActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            webView.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
        }
    });
}
person Can Uludağ    schedule 25.10.2014

Вы пробовали android:layout_height="50dip"

Передайте значение для атрибута высоты, а не используйте wrap_content

person Hardik Trivedi    schedule 18.02.2012
comment
Это, конечно, предотвращает рост веб-просмотра, но я заранее не знаю длину контента, поэтому фиксация высоты, если WebView в моем случае не была вариантом с самого начала. - person Nar Gar; 18.02.2012
comment
Между прочим, я попытался просто загрузить m.yahoo.com (весьма насыщенный контентом и javascript). page) — страница загружается, и веб-представление без проблем изменяет размер, чтобы полностью соответствовать содержимому. Итак, я предполагаю, что есть комбинация ошибок веб-представления + jQuery. - person Nar Gar; 18.02.2012
comment
Что ж, кажется, что ScrollView и WebView несовместимы — и точка. Я попытался использовать веб-представление вне представления прокрутки (что довольно сильно изменило структуру моих шаблонов разработки) - это сработало. Тем не менее это не объясняет тот факт, что бесконечный рост происходит только на страницах с jQuery. - person Nar Gar; 20.02.2012
comment
Вы не должны использовать ScrollView при использовании WebView. WebView уже имеет ScrollView. - person Hardik Trivedi; 20.02.2012
comment
Это верно, Хардик, однако, если веб-просмотр не является единственным элементом в представлении, у меня нет особого выбора, кроме как использовать прокрутку, и в этом случае мне нужно, чтобы веб-просмотр расширялся и обертывал свой собственный контент. - person Nar Gar; 21.02.2012