レイアウト(線形、垂直)階層にはいくつかのビューがあり、そのうちの1つはWebViewです。それらはすべて同じパラメータを持っています:
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
すべてのビューで、要素間の間隔は正しく処理されますが、Webビューでは、表示されたテキストの後に多くのスペースがあります。
レイアウトを使用して、アクティビティの "onCreate"メソッドにWebビューの(HTML)テキストを設定しました。
コンテンツのサイズに合わせて、webviewのサイズを変更する方法はありますか?
ちなみに、残りのスペースはデバイスによって異なります(エミュレーターvsマイルストーンvsヒーロー)。
何か案が?ありがとう
これは遅すぎると確信していますが、誰か他の人が解決策を探してここに来た場合に備えて、私のために機能した方法を追加します。
ページの読み込みが完了したら、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)));
}
});
}
同じ解決策も見られます here。
現時点では、コンテンツが大きすぎる場合にのみWebviewのサイズが変更されるようです。 Webviewが大きい場合、コンテンツを縮小してスペースを再利用しません。
私も同じ問題を抱えていました。 WebViewの可視性を変更することで解決しました。
mWebView.setVisibility(View.GONE);
mWebView.loadData(".....");
mWebView.reload();
mWebView.setVisibility(View.VISIBLE);
数時間検索して試した後、私は最も単純な実用的な解決策を見つけました。これを「リペイント」と呼ぶだけです。
webView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
私のウェブビューでは、scrollView内で完全に機能します。 WRAP_CONTENTを使用したくない場合は、独自のパラメーターを使用できます。
私は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);
私が見つけた:
(1)WebViewには2つの高さがあります。 MeasureHeightおよびcontentHeight。 contentHeightはwebcoreThreadから計算されることに注意してください。 2つの高さは常に一定ではありません!
(2)レイアウトが終了したとき。webviewはコンテンツをリロードします。 contentHeightは、measureHeightと一致しています。
だから私は1つの解決策だと思います:レイアウトが終わった後、webviewにコンテンツをリロードさせます。
私の解決策:
(1)webviewを拡張します。 (2)オーバーライドonlayout()、dispatchDraw()、
@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 ;
}
お役に立てれば。
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)
}
});
}
次のように、JavaScript本体の高さに従ってWebViewの高さを定期的に更新できます。
public class WrapContentWebView extends WebView {
private static final long UPDATE_INTERVAL = 100; // ms
public WrapContentWebView(Context context) {
super(context);
init();
}
public WrapContentWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public WrapContentWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
addJavascriptInterface(new JavascriptInterface(), "Java");
postDelayed(scheduleRunnable, UPDATE_INTERVAL);
}
private Runnable scheduleRunnable = new Runnable() {
@Override
public void run() {
loadUrl("javascript:window.Java.onNewHeight(document.body.offsetHeight);");
postDelayed(scheduleRunnable, UPDATE_INTERVAL);
}
};
private class JavascriptInterface {
@Android.webkit.JavascriptInterface
public void onNewHeight(String bodyOffsetHeight) {
if (bodyOffsetHeight == null) {
return;
}
final int newHeight =
(int) (Integer.parseInt(bodyOffsetHeight) *
getScaleY() *
getResources().getDisplayMetrics().density);
if (getLayoutParams().height != newHeight) {
((Activity) getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
getLayoutParams().height = newHeight;
requestLayout();
}
});
}
}
}
}
layout.xml:
<WrapContentWebView
Android:layout_width="match_parent"
Android:layout_height="0dp">
</WrapContentWebView>
追伸Android 5、4.1、4.04
@Fernwilterに同意します。しかし、順序を変更するとうまくいきました。
mWebView.setVisibility(View.GONE);
mWebView.reload();
mWebView.setVisibility(View.VISIBLE);
mWebView.loadData(".....");
それは私のために働いた。
ViewTreeObserver viewTreeObserver = dataWebView.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (dataWebView.getMeasuredHeight() > 0) {
dataWebView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
((Activity) getContext()).runOnUiThread(() -> {
dataWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0));
dataWebView.setVisibility(View.GONE);
dataWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
dataWebView.setVisibility(View.VISIBLE);
});
}
}
});
ビューを削除してから新しいビューを追加するだけで問題は解決しました。
次に例を示します。
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を追加するだけです。
また、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);
}
});