23

レイアウト (線形、垂直) 階層では、いくつかのビューがあり、そのうちの 1 つが WebView です。それらはすべて同じパラメータを持っています:

android:layout_width="fill_parent"
android:layout_height="wrap_content"

すべてのビューで、要素間の間隔は正しく処理されますが、Webview の場合、内部に表示されるテキストの後に多くのスペースがあります。

レイアウトを使用して、アクティビティの「onCreate」メソッドで webview の (HTML) テキストを設定します。

コンテンツのサイズに合わせて、webview 自体のサイズを変更する方法はありますか?

ちなみに、残りのスペースはデバイスごとに異なります(エミュレーターvsマイルストーンvsヒーロー)

何か案が?ありがとう

4

14 に答える 14

25

これは遅すぎると確信していますが、他の誰かが解決策を探してここに来た場合に備えて、私のために働いた方法を追加します。

ページの読み込みが完了したら、JavaScript メソッドを挿入して JS フックをコールバックします。そして、このメソッドでは のサイズを渡しています。

    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)));
        }
    });
}

ここでも同じソリューションが見られます。

于 2014-08-07T16:00:08.193 に答える
7

現時点では、コンテンツが大きすぎる場合にのみ Webview のサイズが変更されるようです。Web ビューがコンテンツよりも大きい場合、スペースを再利用するために縮小されません。

于 2010-05-06T10:11:24.050 に答える
4

ScrollView 内に webview を配置し、layout_height=wrap_content を設定するだけで機能しました。

<ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/web_scrollview"
        android:layout_below="@id/question_title_section"
        android:layout_marginBottom="60dp"
        android:scrollbars="vertical">
        <WebView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/question_content"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:padding="4dp">
        </WebView>
    </ScrollView>

そして私の活動で

wvQuestion = (WebView) findViewById(R.id.question_content);
wvQuestion.loadUrl(url);
于 2015-04-26T04:46:33.107 に答える
1

私が見つけた:

(1) webview には 2 つの高さがあります。MeasureHeight と contentHeight。contentHeight は webcoreThread から計算されることに注意してください。2 つの高さは常に一致しません。

(2) レイアウトが終了したら、webview がコンテンツをリロードします。contentHeight は measureHeight と一致しています。

したがって、1つの解決策は、レイアウトが完了した後にwebviewにコンテンツをリロードさせることだと思います。

私の解決策:

(1) webview を拡張します。(2)onlayout(),dispatchDraw()をオーバーライド,</p>

@Override
protected void dispatchDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.dispatchDraw(canvas);

    //mchanged  == is parameter in onlayout()
            //finished  == have run the code below !
    if (!mchanged && !finished) {
//                          
        String vHtml =".........." ;//your html content
        this.loadDataWithBaseURL("目录浏览", vHtml, "text/html", "utf-8",                             null);
            finished = true;
    }
}


     protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // TODO Auto-generated method stub
    super.onLayout(changed, l, t, r, b);
    // tttttt
    if (!changed) { 
        this.mchanged = changed;//false
             }
        }

(3) webview は、すべてのコンテンツをロードする前に初期化が必要です。

public void intiFlag() {
    mchanged = true;
        finished = false ;
}

お役に立てれば。

于 2012-03-07T02:45:26.187 に答える
0

TextView、ProgressBar、および WebView を含む FrameLayout で同様の問題が発生しました。サーバーからの戻りオブジェクトに応じて、私はビューを隠していました.onPageFinished()でWebページを表示し、TextViewとProgressBarを非表示にする必要がある場合、WebViewはProgressBarの高さを持っていました. このコードで修正してください:

public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            progressBar.setVisibility(View.GONE)
        }
    });
}
于 2014-06-17T09:00:40.480 に答える
0

ビューを削除してから新しいビューを再度追加すると、問題は解決します。

次に例を示します。

WebView current_view = (WebView) view.getChildAt(i);
CharSequence current_text = current_view.getText();
int index = parent.indexOfChild(current_view);
parent.removeView(current_view);
current_view = new WebView(context);
parent.addView(current_view, index, layoutParams);
current_view.loadDataWithBaseURL( ...however you want... );
view.invalidate();

要約すると...古いものと同じように新しい WebView を同じインデックスの親に追加するだけです。

于 2013-11-21T07:12:30.227 に答える
0

また、JavaScriptでテキストサイズを調整した後、WebViewのサイズが収まらないという問題もありました。onPageFinished()までWebViewの可視性をView.GONEに設定することでこれを解決しました。ページが読み込まれた後、javascript、setVisibility(View.VISIBLE)、および WebView のサイズを使用してフォント サイズなどを微調整し、完全に収まるようにします。

webView.setVisibility(View.GONE);
webView.setWebViewClient(new WebViewClient() {  
    @Override  
        public void onPageFinished(WebView view, String url)  
        {  
         int jsSize = (int)fBioTextSize; //a double set in the owning class...
         String sizeTweak = "" ;
         if (jsSize > 0.00)
         {
             sizeTweak = 
                "document.getElementsByTagName('body')[0].style.fontSize = '" + jsSize + "px'; ";
         }
            view.loadUrl("javascript:(function() { " +  
                    "document.getElementsByTagName('body')[0].style.color = '#9e9e9e'; " +
                    "document.getElementsByTagName('body')[0].style.background = 'black'; " +
                    sizeTweak +
                    "})()");  
           view.setVisibility(View.VISIBLE); 

        }  
    });  
于 2012-10-10T06:49:48.050 に答える
-1

少し複雑ですが、機能しています...

private ViewGroup mScrollView //linearlayout encapsuled in a scrollView;
private WebView mWebView;

private Handler mHandler = new Handler(){      
  public void handleMessage(Message msg){
    mWebView.reload();
    mScrollView.addView(mWebView, 0);
  }
};

private updateWebView(){
  //update the content of your web view
  mScrollView.removeView(mWebView);
  mWebView.clearView();
  mHandler.sendMessageDelayed(mHandler.obtainMessage(0), 200);
}
于 2010-12-02T11:28:01.840 に答える
-1

より簡単な解決策は、読み込みが完了したら webview を無効にすることです。

  webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageFinished(final WebView view, final String url) {
                super.onPageFinished(view, url);
                webView.invalidate();
            }
        });
于 2013-01-07T15:38:55.727 に答える