Android Webview-Webページはデバイス画面にフィットする必要があります


103

デバイスの画面サイズに基づいてWebページを合わせるために、以下を試しました。

mWebview.setInitialScale(30);

メタデータビューポートを設定します

<meta name="viewport" content="width=320, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=0;"/>
<meta name="viewport" content="width=device-width, target-densityDpi=medium-dpi"/>

しかし、何も機能しません。ウェブページはデバイスの画面サイズに固定されていません。

これを入手する方法を誰かに教えてもらえますか?

回答:


82

30に設定するのではなく、手動で使用する必要があるスケールを計算する必要があります。

private int getScale(){
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    int width = display.getWidth(); 
    Double val = new Double(width)/new Double(PIC_WIDTH);
    val = val * 100d;
    return val.intValue();
}

次に使用します

WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());

7
返信ありがとうございます。しかし、私には別の問題があります。画像を読み込んでおらず、webviewでWebページを読み込んでいるので、Webページの幅(PIC_WIDTH)を確認する方法。
SWDeveloper 2010年

1
ああ、そこにはその定数がありませんでした。申し訳ありません。実際のウェブページの幅を取得する方法がわかりません。
danh32

54
ここにPIC_WIDTHとは何ですか?
パレシマヤニ

4
PIC_WIDTHは、資産フォルダーから単一の画像を表示するだけだったので、事前に知っていた定数でした。上で述べたように、実際のWebページの幅を取得する方法はわかりません。
danh32 2012

1
@MaheshwarLigade私はPIC_WIDTH = 360を使用
Nicholas Ng

292

これを使えます

    WebView browser = (WebView) findViewById(R.id.webview);
    browser.getSettings().setLoadWithOverviewMode(true);
    browser.getSettings().setUseWideViewPort(true);

これにより、画面サイズに基づいてサイズが修正されます。


4
これは画面に表示されますが、ズームイン/ズームアウトはできなくなります。この問題は改善されましたか?、IOSで可能であることがわかっています。
AlexAndro

1
この設定は私にとっては機能しますが、幅についてのみ機能します。同じ場合では、高さを切り取っています
albanx

1
これは私がこれまでに見つけたこれを達成するための最良の解決策です。
フラゴン2015年

1
ソリューションが組み込まれているという事実は本当に私に勝っています。
Daniel Handojo

3
ズームを追加するには、以下を追加します:webview.getSettings()。setBuiltInZoomControls(true); webview.getSettings()。setDisplayZoomControls(false);
Andrew

34

友達、

私はあなたからたくさんのインポートと素晴らしい情報を見つけました。しかし、私にとっては唯一の方法はこの方法でした:

webView = (WebView) findViewById(R.id.noticiasWebView);
webView.setInitialScale(1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);
webView.loadUrl("http://www.resource.com.br/");

会社のデバイスの種類が原因で、Android 2.1に取り組んでいます。しかし、それぞれの情報の一部を使用して問題を修正しました。

ありがとうございます!


その後、ズームは機能しなくなります。この問題を抱えているのは私だけですか?
テスト

@testingあなたはそれの解決策を得ましたか?
Anshul Tyagi

@AnshulTyagi:いいえ、しませんでした。それは私にとってテストプロジェクトだったので、これについてさらに調査することはしませんでした。何か見つけたら教えてください!
2016年

@AnshulTyagi:Webページの場合、このアプローチがうまくいきます。画像の場合、別の何かを使用する必要があります...
テスト

31

これらの設定は私のために働きました:

wv.setInitialScale(1);
wv.getSettings().setLoadWithOverviewMode(true);
wv.getSettings().setUseWideViewPort(true);
wv.getSettings().setJavaScriptEnabled(true);

私の試みでは、setInitialScale(1)がありませんでした。

ドキュメントはそれを言っているが0あれば、すべての道をズームアウトしますsetUseWideViewPortがに設定されている真のが、0が私のために仕事をしませんでしたし、私は設定していた1


1
私は最初のスケールを設定していませんでした、そしてそれは何年もの間私のために働きました。(私は単に概要モードとビューポートを設定していました)。しかし、私が遭遇したばかりの新しいデバイスは、ページが更新されるまでズームインし始めたようです。最初のスケールを設定すると、これが修正されました。
Doomsknight


15

あなたがする必要があるのは単に

webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

13

これらは私にとってはうまくいき、WebViewを画面の幅に合わせます:

// get from xml, with all size set "fill_parent"  
webView = (WebView) findViewById(R.id.webview_in_layout);  
// fit the width of screen
webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 
// remove a weird white line on the right size
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);  

上記のアドバイスとEclipse Webビューの白い線に感謝



11

このコードを使用すると同じ問題が発生します

webview.setWebViewClient(new WebViewClient() {
}

あなたはそれをあなたのコードから削除する必要があるかもしれません
そしてあなたのウェブビューのために以下の3つのモードを追加することを忘れないでください

    webview.getSettings().setJavaScriptEnabled(true);  
    webview.getSettings().setLoadWithOverviewMode(true);
    webview.getSettings().setUseWideViewPort(true);

これは画面サイズに基づいてサイズを修正します


2
@shahzainaliあなたはあなたのウェブビューをズームできますか?
Anshul Tyagi

@AnshulTyagiいいえ、ズームしません。
shahzain ali 2016

6
WebView browser = (WebView) findViewById(R.id.webview);
browser.getSettings().setLoadWithOverviewMode(true);
browser.getSettings().setUseWideViewPort(true);
browser.getSettings().setMinimumFontSize(40);

.setLoadWithOverViewModeと.setUseWideViewPortによってテキストサイズが非常に小さく設定されているので、これは私にとってはうまく機能します。


6

私はhtml文字列のビデオを持っていましたが、Webビューの幅は画面の幅よりも大きく、これは私にとってはうまくいきました。

これらの行をHTML文字列に追加します。

<head>
<meta name="viewport" content="width=device-width">
</head>

上記のコードをHTML文字列に追加した結果:

<!DOCTYPE html>
<html>

<head>
<meta name="viewport" content="width=device-width">
</head>


</html>

5

この場合、webViewでHTMLを使用する必要があります。私は次のコードを使用してこれを解決しました

webView.loadDataWithBaseURL(null,
                "<!DOCTYPE html><html><body style = \"text-align:center\"><img src= "
                        + \"http://www.koenvangorp.be/photos/2005_09_16-moon_2000.jpg\"
                        + " alt=\"pageNo\" width=\"100%\"></body></html>",
                "text/html", "UTF-8", null);

%の代わりにpx ot vhを使用することをお勧めします。iframeの%には方向の変更に関するいくつかのバグがあります
Siarhei

4

display.getWidth();以降、danh32による回答を変更します。は非推奨になりました。

private int getScale(){
    Point p = new Point();
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    display.getSize(p);
    int width = p.x; 
    Double val = new Double(width)/new Double(PIC_WIDTH);
    val = val * 100d;
    return val.intValue();
}

次に使用します

WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());

スケールは1または100%未満であると計算したので、幅をPIC_WIDTHと比較して比率を取得しました。それ以上に、私はいくつかのパディングも差し引いた。
Abhinav Saxena 2017年

4

これはXMLの問題のようです。Web-Viewを含むXMLドキュメントを開きます。上部の埋め込みコードを削除します。

次に、レイアウトに追加します

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

Web-Viewで、

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

これにより、Web-Viewがデバイス画面にフィットします。


それは私の時間を節約するものです。
Kabkee 2017

2
fill_parentは古くなっています。match_parentを使用してください。
Trevor Hart

3
webview.setInitialScale(1);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setJavaScriptEnabled(true);

動作しますが、次のようなものを削除することを忘れないでください:

<meta name="viewport" content="user-scalable=no"/>

HTMLファイルに存在する場合、またはuser-scalable = yesを変更します。存在しない場合は存在しません。



2

これは、Webページに従ってエミュレータを調整するのに役立ちます。

WebView wb;
//CALL THIS METHOD
wb.setInitialScale(50);

上記のように、初期スケールをパーセンテージで設定できます。


2

DisplayオブジェクトのgetWidthメソッドは廃止されました。onSizeChangedをオーバーライドして、WebViewが使用可能になったときのサイズを取得します。

WebView webView = new WebView(context) {

    @Override
    protected void onSizeChanged(int w, int h, int ow, int oh) {

        // if width is zero, this method will be called again
        if (w != 0) {

            Double scale = Double.valueOf(w) / Double.valueOf(WEB_PAGE_WIDTH);

            scale *= 100d;

            setInitialScale(scale.intValue());
        }

        super.onSizeChanged(w, h, ow, oh);
    }
};

どうやって手に入れWEB_PAGE_WIDTHますか?
テスト

画面に合わせて固定幅のコンテンツを拡大縮小する場合は、コンテンツの幅を事前に知っておく必要があります。それは理にかなっていますか?
SharkAlley 2016

これは画像で機能するはずです。ただし、Webページ(レスポンシブにすることができます)の場合、たとえば320pxを超える任意の幅にすることができます。
テスト


1

@ danh32の回答に基づいて、非推奨のメソッドを使用しない更新バージョンを次に示します。

protected int getScale(Double contentWidth) {
    if(this.getActivity() != null) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        this.getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        Double val = displaymetrics.widthPixels / contentWidth * 100d;
        return val.intValue();
    } else {
        return 100;
    }
}

同様に使用する:

int initialScale = this.getScale(420d);
this.mWebView.setInitialScale(initialScale);

0

参考までに、これは@ danh32のソリューションのKotlin実装です。

private fun getWebviewScale (contentWidth : Int) : Int {
    val dm = DisplayMetrics()
    windowManager.defaultDisplay.getRealMetrics(dm)
    val pixWidth = dm.widthPixels;
    return (pixWidth.toFloat()/contentWidth.toFloat() * 100F)
             .toInt()
}

私の場合、幅は3つの画像によって300 pixになるように決定されました。

webview.setInitialScale(getWebviewScale(300))

この投稿を見つけるのに何時間もかかりました。ありがとう!


-4
WebView webView = (WebView)findViewById(R.id.web_view);
webView.setInitialScale((int) getResources().getDimension(R.dimen._50sdp)); // getActivity(). if you are at Fragment
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.loadDataWithBaseURL(null,here comes html content,"text/html","UTF-8", null);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setDisplayZoomControls(true);
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);

反対票のためだけに同じ内容の2つの回答を投稿しないでください。
techydesigner 2016

そして、少し努力してコードをフォーマットしてください!どうしてそんなに右にインデントしたの?空白を削除するには時間がかかりすぎますか?
Massimiliano Kraus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.