2013-03-21 85 views
24

問題的詳細解釋可以從this question中理解,因爲用戶已經添加了圖像來更好地解釋它。如何根據內容動態縮小WebView大小?

我在我的WebView中加載Html內容。我的佈局有許多視圖,WebView放置在ScrollView中(按照佈局要求)。請不要回答爲 - "Don't put WebView inside ScrollView"。我知道將WebView放入ScrollView並不是一件好事,但根據需要,我需要這樣做。因此,我有左片段(顯示列表項目)和右片段(顯示數據反映從左片段選擇列表項目)。現在,首先當我在WebV中加載Html內容時,它顯示正確。之後,當我用新的Html內容刷新WebView時,就會出現問題。

假設,我的第一個Html內容是100行,它顯示正確,然後我重新加載WebView與我的新的Html內容是40行然後WebView不縮小和適合40行內容,它仍然存在只要100行在底部顯示白色/空白空間。

因此,似乎WebView能夠從較小的內容重新調整自己的尺寸,而內容先前加載到更多的內容,但當內容小於先前加載的內容時無法重新調整自己的尺寸。

我試過很多方法,

  • 在清單中添加android:hardwareAccelerated="true"
  • This Blog
  • 也有許多其他的方式和博客
  • 此外,我曾試圖用mWebView.clearView();這會導致重新大小的WebView的大小,但有時WebView開始閃爍,這只是令人討厭。類似於this video

但是,找不到任何適當的解決方案。如果您之前有人遇到同樣的問題,請告訴我可以申請的最佳解決方案。

更新 -

經過進一步google搜索似乎這是在蜂窩衆所周知的問題。 This question也表示類似的問題。

+0

你必須嘗試,但我只是要確認,你是否嘗試在webView上調用invalidate。其他的事情是你把scrollView的fillViewPort屬性設置爲true。 – 2013-03-21 12:38:45

+0

@ N-JOY是啊我試圖調用mWebView.invalidate(),我也嘗試使用ScrollView的fillViewPort,仍然沒有成功。 – 2013-03-21 12:44:19

回答

5

似乎沒有辦法調整大小動態調整其大小(減少)其大小一旦其加載。所以,唯一能解決我的問題的是重新加載完整的WebView。所以,我沒有在xml中定義片段,而是每次都通過動態添加片段來改變我的東西。我能夠解決我的問題。

希望這將有助於他人在未來!

+0

看到我的答案,我設法找到一種神奇的方法=) – 2013-05-31 07:38:39

+0

「重新加載完整的webview」是什麼意思? – Bryan 2014-04-02 19:31:12

+0

@Bryan這意味着我正在用另一個替換完整的片段。 – 2014-04-03 05:12:17

1

這是WebView的已知問題,某些可用解決方案在所有設備中都不起作用。

我嘗試了許多解決方案給出的答案,也搜索了互聯網,但他們都沒有爲我工作。

我結束了,取出的WebView,並在同一位置佈局

這裏再次添加的WebView的是,演示代碼,

 final RelativeLayout rl = new RelativeLayout(this); 
     myWebView = new WebView(this); 
     myWebView.setBackgroundColor(Color.GRAY); 
     myWebView.loadUrl("file:///android_asset/1.htm"); 
     rl.addView(myWebView); // ******* Added At Index 0 
     Button btn = new Button(this); 
     btn.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       if (!flg) { 
        rl.removeViewAt(0); 
        myWebView = new WebView(MainActivity.this); 
        myWebView.setBackgroundColor(Color.GRAY); 
        myWebView.loadUrl("file:///android_asset/3.htm"); 
        rl.addView(myWebView, 0, new RelativeLayout.LayoutParams(
          new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.WRAP_CONTENT))); 
        flg = true; 
       } else { 
        rl.removeViewAt(0); 
        myWebView = new WebView(MainActivity.this); 
        myWebView.setBackgroundColor(Color.GRAY); 
        myWebView.loadUrl("file:///android_asset/1.htm"); 
        rl.addView(myWebView, 0, new RelativeLayout.LayoutParams(
          new LayoutParams(LayoutParams.FILL_PARENT, 
            LayoutParams.WRAP_CONTENT))); 
        flg = false; 
       } 
      } 
     }); 
     rl.addView(btn); // ******* Added At Index 1 
     setContentView(rl); 
+1

感謝您的回覆,但是您是否在問題中添加了我添加的[此博客](http://vision-apps.blogspot.in/2012/08/android-webview-tips-tricks.html)說如果我們每次都試圖動態添加WebView,WebView就會出現閃爍的效果。 – 2013-03-21 13:42:59

+1

這在我的情況下工作,所謂的「眨眼睛」幾乎看不見。 – sandalone 2015-04-24 15:19:22

0

我還沒有嘗試過,但你爲什麼不在加載新內容之前,再次設置weblayout參數來嘗試一下。即將高度和寬度設置爲wrapcontent。如果成功,請回復。如果不會找到成功更好去javascipt

+0

我曾嘗試過,但也是行不通的! – 2013-03-22 08:29:12

1

夥計們,似乎我找到了本地內容的解決方案。您應該在加載新內容之前調用webView.reload() - 不知何故,它會調整大小而不閃爍。

+0

我也試過重裝方法,但是我也沒有在這方面找到任何運氣。 ':( – 2013-05-31 08:24:20

+0

同樣在這裏,沒有爲我工作 – 2014-01-17 08:26:33

+0

我既沒有,雖然 – gray 2014-04-11 11:09:15

0

我將WebView的可見性設置爲「無效」,並在WebView消失時將內容加載到WebView中。然後,我將可見性設置爲讓DOM和JS加載後可見,並且它似乎正確地繪製了長度。由於沒有像onPageFinished這樣的回調來確定JS何時完成執行,因此在將可見性設置爲true之前,我給WebView一個延遲時間。這種解決方法足以滿足我的目的,所以希望它能解決您們中某些人的需求!

0

每次創造的WebView的對象,並給它的參數是一個痛苦而不是你可以做下面的步驟,也將努力

  • 把一個空白的HTML文件中assets文件夾,並給它一個名稱 empty.html

  • 呼叫webview.loadUrl("file:///android_asset/empty.html");

  • 現在加載您的內容。

Webview會縮小其高度。

確保您不把任何內容empty.html

+0

Nop,它doesn'我認爲所有這些技巧有時候會在某些具有不同固件的設備上工作,但它們對於所有設備來說並不是100%肯定的事情。 – Kaizie 2017-01-18 08:33:15

1

This做的魔力!它說

的Android特性:Android的:layout_weight = 「1佈局應該工作...

在我的情況,Webview是在RelativeLayout的這樣算下來THI機器人:layout_height =」 WRAP_CONTENT 「工作就像一個魅力:)

+1

對我來說也是如此。似乎是最簡單的解決方案。子對象爲LinearLayout,其layout_height設置爲「0dp」 – Bunkerbewohner 2015-05-08 21:30:29

+0

請提供您的佈局,我的WebView總是得到0的高度 – vyndor 2016-03-28 13:37:18

0

在這裏,我已經改變了的WebView取決於softkeyboard顯示器的高度

activityRootView = (RelativeLayout) findViewById(R.id.webview1); 
      mWebView = (WebViewEx) WebViewActivity.this.findViewById(R.id.webview); 

      activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
       public void onGlobalLayout() { 
        Rect r = new Rect(); 
        //r will be populated with the coordinates of your view that area still visible. 
        activityRootView.getWindowVisibleDisplayFrame(r); 

        int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); 
        if(heightDiff != lastValue) { 
         if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... 
          Log.i("Screen Size Changed","KeyBoard Displaying"+ r.bottom); 

          RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
          params.height=r.bottom; 
          mWebView.setLayoutParams(params); 
          //appView.sendJavascript("onKeyBoardShow(" + r.bottom + ");"); 
         } else { 
          /// appView.sendJavascript("onKeyBoardHide();"); 
          Log.i("Screen Size Changed","KeyBoard not displaying" +r.bottom); 
          RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
          params.height=r.bottom; 
          mWebView.setLayoutParams(params); 
         } 
         lastValue = heightDiff; 
        } 
       } 
      }); 
+0

我沒有任何問題,所有軟鍵盤都沒有,所以這並沒有任何連接到我的題 – 2014-09-29 12:52:17

0

由於@Ankit指出,去一封空白頁面可以提供幫助。不過,「about:blank」更好。

相關問題