Android Webview - หน้าเว็บควรพอดีกับหน้าจออุปกรณ์


104

ฉันได้ลองทำสิ่งต่อไปนี้เพื่อให้พอดีกับหน้าเว็บตามขนาดหน้าจอของอุปกรณ์

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
ขอบคุณสำหรับคำตอบของคุณใช่มันได้ผล แต่ฉันมีปัญหาอื่น ฉันไม่ได้โหลดรูปภาพกำลังโหลดหน้าเว็บในมุมมองเว็บดังนั้นวิธีค้นหาความกว้างของหน้าเว็บ (PIC_WIDTH)
SWDeveloper

1
อาฉันพลาดค่าคงที่ในนั้น ขอโทษด้วยกับเรื่องนั้น. ฉันไม่แน่ใจว่าคุณจะรับความกว้างของหน้าเว็บจริงได้อย่างไร
danh32

55
PIC_WIDTH ที่นี่คืออะไร
Paresh Mayani

4
PIC_WIDTH เป็นค่าคงที่ที่ฉันรู้ล่วงหน้าเนื่องจากฉันเพิ่งแสดงภาพเดียวจากโฟลเดอร์เนื้อหา ดังที่ฉันได้กล่าวไว้ข้างต้นฉันไม่รู้ว่าคุณจะรับความกว้างของหน้าเว็บจริงได้อย่างไร
danh32

1
@MaheshwarLigade ฉันใช้ PIC_WIDTH = 360
Nicholas Ng

293

คุณสามารถใช้สิ่งนี้

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

ซึ่งจะแก้ไขขนาดตามขนาดหน้าจอ


4
นี่เป็นฐานของหน้าจอ แต่ไม่อนุญาตให้คุณทำการย่อ / ขยาย ปัญหานี้ดีขึ้นหรือไม่ฉันรู้ว่าเป็นไปได้บน IOS
AlexAndro

1
การตั้งค่านี้ใช้ได้กับฉัน แต่สำหรับความกว้างเท่านั้นในกรณีเดียวกันตอนนี้มันถูกตัดความสูงออกไป
albanx

1
นี่เป็นทางออกที่ดีที่สุดในการบรรลุสิ่งนี้ที่ฉันเคยพบมา
fragon

1
ความจริงที่ว่าโซลูชันในตัวทำให้ฉันชนะจริงๆ
Daniel Handojo

3
ในการเพิ่มการซูมให้เพิ่มสิ่งต่อไปนี้: webview.getSettings (). setBuiltInZoomControls (true); webview.getSettings (). setDisplayZoomControls (เท็จ);
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 เนื่องจากอุปกรณ์ประเภทต่างๆของ บริษัท แต่ฉันแก้ไขปัญหาของฉันโดยใช้ส่วนของข้อมูลจากแต่ละส่วน

ขอบคุณ!


จากนั้นการซูมจะไม่ทำงานอีกต่อไป ฉันเป็นคนเดียวที่มีปัญหานี้?
ทดสอบ

@ การทดสอบคุณได้รับวิธีแก้ไขหรือไม่?
Anshul Tyagi

@AnshulTyagi: ไม่ฉันไม่ได้ เนื่องจากเป็นโครงการทดสอบสำหรับฉันฉันจึงไม่ได้ตรวจสอบเรื่องนี้เพิ่มเติม แจ้งให้เราทราบหากคุณพบบางสิ่ง!
ทดสอบ

@AnshulTyagi: สำหรับหน้าเว็บวิธีนี้ใช้ได้ผลสำหรับฉัน สำหรับภาพฉันต้องใช้อะไรที่แตกต่างออกไป ...
ทดสอบ

31

การตั้งค่าเหล่านี้ใช้ได้ผลสำหรับฉัน:

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

setInitialScale (1)หายไปในความพยายามของฉัน

แม้ว่าเอกสารบอกว่า0จะขยายทุกอย่างออกถ้าsetUseWideViewPortถูกตั้งค่าเป็นจริงแต่0ไม่ทำงานสำหรับฉันและฉันได้ไปตั้ง1


1
ฉันไม่ได้ตั้งค่ามาตราส่วนเบื้องต้นและมันใช้ได้ผลกับฉันมาหลายปีแล้ว (ฉันแค่ตั้งค่าโหมดภาพรวมและวิวพอร์ต) แต่อุปกรณ์ใหม่ที่ฉันเพิ่งเจอดูเหมือนจะเริ่มซูมเข้าจนกว่าหน้าจะรีเฟรช การตั้งค่ามาตราส่วนเบื้องต้นได้รับการแก้ไขสำหรับฉัน
IAmGroot

25

ลองใช้เคล็ดลับ HTML5 นี้

http://www.html5rocks.com/en/mobile/mobifying.html

และด้วยสิ่งนี้หากเวอร์ชัน Android ของคุณเป็น 2.1 หรือสูงกว่า

  WebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

2
น่าเสียดายที่พวกเขาเลิกใช้สิ่งนี้และโซลูชันนี้ล้มเหลวสำหรับฉันใน Galaxy S5
2cupsOfTech


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

ขอบคุณคำแนะนำข้างต้นและWhite line ในมุมมองเว็บ eclipse


3
ดูเหมือนว่า SINGLE_COLUMN จะเลิกใช้แล้วตอนนี้developer.android.com/reference/android/webkit/…
Alexander Abramov

11

ฉันมีปัญหาเดียวกันเมื่อใช้รหัสนี้

webview.setWebViewClient(new WebViewClient() {
}

ดังนั้นคุณควรลบออกในโค้ดของคุณ
และอย่าลืมเพิ่ม 3 โหมดด้านล่างสำหรับ webview ของคุณ

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

ซึ่งจะแก้ไขขนาดตามขนาดหน้าจอ


2
@shahzainali คุณสามารถซูมดูเว็บของคุณ?
Anshul Tyagi

@AnshulTyagi ไม่มันไม่ซูม
shahzain ali

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

สิ่งนี้ใช้งานได้ดีสำหรับฉันเนื่องจากขนาดตัวอักษรถูกตั้งค่าให้เล็กมากโดย. setLoadWithOverViewMode และ. setUseWideViewPort


6

ฉันมีวิดีโอในสตริง html และความกว้างของการดูเว็บมีขนาดใหญ่กว่าความกว้างของหน้าจอและสิ่งนี้ใช้ได้ผลสำหรับฉัน

เพิ่มบรรทัดเหล่านี้ในสตริง 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

คุณต้องใช้ HTML ใน webView ของคุณในกรณีนี้ ฉันแก้ไขสิ่งนี้โดยใช้รหัสต่อไปนี้

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

ทำการเปลี่ยนแปลงคำตอบโดย danh32 ตั้งแต่ display.getWidth (); เลิกใช้งานแล้ว

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

4

ดูเหมือนว่าปัญหา XML เปิดเอกสาร XML ที่มี Web-View ของคุณ ลบรหัสช่องว่างที่ด้านบน

จากนั้นในเค้าโครงให้เพิ่ม

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

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 = ใช่มิฉะนั้นจะไม่



2

สิ่งนี้จะช่วยในการปรับโปรแกรมจำลองตามหน้าเว็บ:

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

คุณสามารถกำหนดมาตราส่วนเบื้องต้นเป็นเปอร์เซ็นต์ดังที่แสดงด้านบน


2

เมธอด 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

ตกลงสิ่งนี้ควรใช้ได้กับภาพ แต่สำหรับหน้าเว็บ (ซึ่งสามารถตอบสนองได้) อาจมีความกว้าง> 320px ก็ได้
ทดสอบ

1

ในทางทฤษฎีการรวมกันของ:

settings.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS); 

ด้วย

settings.setUseWideViewPort(false)

แก้ไขปัญหาห่อเนื้อหาและปรับให้พอดีกับหน้าจอ แต่NARROW_COLUMNSเลิกใช้แล้ว ฉันแนะนำให้คุณอ่านหัวข้อนี้ด้านล่างเพื่อสำรวจปัญหาโดยละเอียด: https://code.google.com/p/android/issues/detail?id=62378


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

สำหรับการอ้างอิงนี่คือการนำ Kotlin ไปใช้กับโซลูชันของ @ 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()
}

ในกรณีของฉันความกว้างถูกกำหนดโดยสามภาพเป็น 300 พิกเซลดังนั้น:

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

กรุณาอย่าโพสต์คำตอบสองคำที่มีเนื้อหาเดียวกันเพียงเพราะการโหวตลง
techydesigner

และโปรดจัดรูปแบบโค้ดของคุณโดยใช้ความพยายามเล็กน้อย! ทำไมคุณเยื้องไปทางขวามากนัก? มีเวลามากเกินไปในการลบพื้นที่สีขาวหรือไม่?
Massimiliano Kraus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.