Android Webview - Trang web phải vừa với màn hình thiết bị


103

Tôi đã thử các cách sau để vừa với trang web dựa trên kích thước màn hình thiết bị.

mWebview.setInitialScale(30);

và sau đó đặt chế độ xem siêu dữ liệu

<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"/>

Nhưng không có gì hoạt động, trang web không cố định với kích thước màn hình thiết bị.

Bất cứ ai có thể cho tôi biết làm thế nào để có được điều này?

Câu trả lời:


82

Bạn phải tính toán thang đo mà bạn cần sử dụng theo cách thủ công, thay vì đặt thành 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();
}

Sau đó sử dụng

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

7
Cảm ơn bạn đã trả lời, bạn đúng rồi, nó hoạt động. nhưng tôi có vấn đề khác nhau. Tôi không tải hình ảnh, tải trang web trong chế độ xem web, Vậy làm cách nào để tìm ra chiều rộng trang web (PIC_WIDTH).
SWDeveloper 13/10/10

1
Ah, tôi đã bỏ lỡ hằng số đó trong đó. Xin lỗi vì điều đó. Tôi không chắc làm thế nào bạn có thể có được chiều rộng của trang web thực tế.
danh32 13/10/10

54
PIC_WIDTH ở đây là gì?
Paresh Mayani

4
PIC_WIDTH là một hằng số mà tôi đã biết trước, vì tôi chỉ hiển thị một hình ảnh duy nhất từ ​​thư mục nội dung. Như tôi đã nói ở trên, tôi không biết làm thế nào bạn có thể lấy được chiều rộng của trang web thực tế.
danh32

1
@MaheshwarLigade tôi sử dụng PIC_WIDTH = 360
Nicholas Ng

292

Bạn có thể sử dụng cái này

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

điều này sửa kích thước dựa trên kích thước màn hình.


4
Điều này đặt màn hình nhưng không cho phép bạn phóng to / thu nhỏ nữa. Vấn đề này có thể cải thiện không ?, Tôi biết nó có thể xảy ra trên IOS.
AlexAndro

1
thiết lập này làm việc cho tôi nhưng chỉ cho chiều rộng, trong cùng một trường hợp bây giờ nó được cuting tắt chiều cao
albanx

1
Đây là giải pháp tốt nhất để đạt được điều này mà tôi đã tìm thấy cho đến nay.
fragon

1
Thực tế là giải pháp được tích hợp sẵn thực sự khiến tôi chiến thắng.
Daniel Handojo

3
Để thêm thu phóng, hãy thêm phần sau: webview.getSettings (). SetBuiltInZoomControls (true); webview.getSettings (). setDisplayZoomControls (false);
Andrew

34

Bạn bè,

Tôi tìm thấy rất nhiều nhập khẩu và thông tin tuyệt vời từ bạn. Nhưng, cách duy nhất phù hợp với tôi là cách này:

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/");

Tôi đang làm việc trên Android 2.1 vì loại thiết bị của công ty. Nhưng tôi đã khắc phục sự cố của mình bằng cách sử dụng phần thông tin từ mỗi cái.

Cảm ơn bạn!


Sau đó, tính năng thu phóng không hoạt động nữa. Tôi là người duy nhất có vấn đề này?
kiểm tra

@testing bạn có nhận được giải pháp nào không?
Anshul Tyagi

@AnshulTyagi: Không, tôi không có. Vì đó là một dự án thử nghiệm đối với tôi nên tôi đã không điều tra thêm về điều này. Hãy cho tôi biết nếu bạn tìm thấy một cái gì đó!
kiểm tra

@AnshulTyagi: Đối với các trang web , phương pháp này phù hợp với tôi. Đối với hình ảnh, tôi phải sử dụng một cái gì đó khác ...
kiểm tra

31

Các cài đặt này phù hợp với tôi:

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

setInitialScale (1) bị thiếu trong các lần thử của tôi.

Mặc dù tài liệu nói rằng 0 sẽ thu phóng hết cỡ nếu setUseWideViewPort được đặt thành true nhưng 0 không hoạt động với tôi và tôi phải đặt 1 .


1
Tôi đã không thiết lập quy mô phức tạp, và nó đã hoạt động với tôi trong nhiều năm. (tôi chỉ đang đặt chế độ tổng quan và chế độ xem). Nhưng một thiết bị mới mà Ive vừa gặp có vẻ như bắt đầu phóng to cho đến khi trang được làm mới. Đặt quy mô nội bộ đã khắc phục điều này cho tôi.
Doomsknight


15

Tất cả những gì bạn cần làm đơn giản là

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

13

Những điều này phù hợp với tôi và phù hợp với WebView với chiều rộng màn hình:

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

Cảm ơn lời khuyên ở trên và Đường trắng trong chế độ xem Web nhật thực


3
Có vẻ như SINGLE_COLUMN hiện không được dùng nữa trên developer.android.com/reference/android/webkit/…
Alexander Abramov,

11

Tôi gặp vấn đề tương tự khi sử dụng mã này

webview.setWebViewClient(new WebViewClient() {
}

vì vậy có thể bạn nên xóa nó trong mã của mình
Và hãy nhớ thêm 3 chế độ bên dưới cho chế độ xem web của bạn

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

điều này sửa kích thước dựa trên kích thước màn hình


2
@shahzainali bạn có thể thu phóng chế độ xem web của mình không?
Anshul Tyagi

@AnshulTyagi Không, nó không phóng to.
shahzain ali

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

Điều này rất hiệu quả đối với tôi vì kích thước văn bản đã được đặt thành thực sự nhỏ bởi .setLoadWithOverViewMode và .setUseWideViewPort.


6

Tôi có video trong chuỗi html và chiều rộng của chế độ xem web lớn hơn chiều rộng màn hình đó và điều này đang hoạt động đối với tôi.

Thêm các dòng này vào chuỗi HTML.

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

Kết quả sau khi thêm đoạn mã trên vào chuỗi HTML:

<!DOCTYPE html>
<html>

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


</html>

5

Bạn phải sử dụng HTML trong webView của mình trong trường hợp này. Tôi đã giải quyết vấn đề này bằng cách sử dụng mã sau

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

Tôi đoán tốt hơn là sử dụng px ot vh thay vì%. % Trong iframe có một số lỗi về sự thay đổi định hướng
Siarhei

4

Thực hiện thay đổi câu trả lời bởi danh32 kể từ khi hiển thị.getWidth (); hiện không được dùng nữa.

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

Sau đó sử dụng

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

Tôi đã tính toán rằng tỷ lệ phải <1 hoặc 100% vì vậy tôi đã so sánh chiều rộng của mình với PIC_WIDTH để có được tỷ lệ. Hơn thế nữa, tôi cũng trừ một số phần đệm.
Abhinav Saxena

4

Đây có vẻ như là một vấn đề về XML. Mở tài liệu XML có chứa Web-View của bạn. Xóa mã đệm ở trên cùng.

Sau đó, trong bố cục, thêm

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

Trong Web-View, thêm

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

Điều này làm cho Web-View vừa với màn hình thiết bị.


đó là những gì tiết kiệm thời gian của tôi.
Kabkee

2
fill_parent đã lỗi thời, hãy sử dụng match_parent.
Trevor Hart

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

sẽ hoạt động, nhưng hãy nhớ xóa một số thứ như:

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

nếu tồn tại trong tệp html hoặc thay đổi user-scalable = yes, nếu không thì không.


2
int PIC_WIDTH= webView.getRight()-webView.getLeft();

1
GetRight và getLeft luôn trả về 0 đối với tôi
yrazlik

2

Điều này sẽ giúp điều chỉnh trình giả lập theo trang web:

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

Bạn có thể đặt tỷ lệ nguyên theo tỷ lệ phần trăm như được hiển thị ở trên.


2

Phương thức getWidth của đối tượng Display không được dùng nữa. Ghi đè onSizeChanged để có kích thước của WebView khi nó khả dụng.

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

Làm thế nào để bạn nhận được WEB_PAGE_WIDTH?
kiểm tra

Nếu bạn đang cố gắng chia tỷ lệ một số nội dung có chiều rộng cố định để vừa với màn hình, thì bạn nên biết trước nội dung của mình rộng như thế nào. Điều đó có ý nghĩa?
SharkAlley

OK, điều này sẽ hoạt động cho hình ảnh. Nhưng đối với các trang web (có thể đáp ứng), nó có thể là bất kỳ chiều rộng nào> 320px.
kiểm tra


1

đây là phiên bản cập nhật, không sử dụng các phương pháp không được dùng nữa, dựa trên câu trả lời của @ 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;
    }
}

được sử dụng như nhau:

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

0

Để tham khảo, đây là cách triển khai Kotlin của giải pháp @ danh32:

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

Trong trường hợp của tôi, chiều rộng được xác định bởi ba hình ảnh là 300 pix nên:

webview.setInitialScale(getWebviewScale(300))

Tôi đã mất hàng giờ để tìm thấy bài viết này. Cảm ơn!


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

Vui lòng không đăng hai câu trả lời có cùng nội dung chỉ vì lượt bình chọn thấp.
techydesigner

Và vui lòng định dạng mã của bạn tốn một chút công sức! Tại sao bạn lại thụt vào bên phải nhiều như vậy? Quá nhiều thời gian để xóa một số khoảng trắng?
Massimiliano Kraus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.