Android Web Görünümü - Web sayfası cihaz ekranına sığmalıdır


103

Aşağıdakileri, cihaz ekran boyutuna göre web sayfasına sığdırmak için denedim.

mWebview.setInitialScale(30);

ve sonra meta veri görünüm alanını ayarlayın

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

Ancak hiçbir şey çalışmıyor, web sayfası cihazın ekran boyutuna sabitlenmiyor.

Biri bana bunu nasıl alacağımı söyleyebilir mi?

Yanıtlar:


82

30'a ayarlamak yerine manuel olarak kullanmanız gereken ölçeği hesaplamanız gerekir.

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

Sonra kullan

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

7
Cevabınız için teşekkürler, haklısınız, işe yarıyor. ama farklı bir sorunum var. Bir resim yüklemiyorum, web sayfasını web görünümünde yüklüyorum, Peki web sayfası genişliğini nasıl bulabilirim (PIC_WIDTH).
SWDeveloper

1
Ah, oradaki sabiti kaçırdım. Bunun için üzgünüm. Gerçek web sayfasının genişliğini nasıl elde edeceğinizden emin değilim.
danh32

54
Burada PIC_WIDTH nedir?
Paresh Mayani

4
PIC_WIDTH, varlıklar klasöründen sadece tek bir resim görüntülediğim için önceden bildiğim bir sabitti. Yukarıda söylediğim gibi, gerçek web sayfasının genişliğini nasıl elde edeceğinizi bilmiyorum.
danh32

1
@MaheshwarLigade kullanıyorum PIC_WIDTH = 360
Nicholas Ng

292

Bunu kullanabilirsin

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

bu, boyutu ekran boyutuna göre düzeltir.


4
Bu, ekranı ayaklar ancak artık yakınlaştırma / uzaklaştırma yapmanıza izin vermez. Bu sorun düzelebilir mi? IOS'ta mümkün olduğunu biliyorum.
AlexAndro

1
bu ayarlar benim için çalışıyor, ancak yalnızca genişlik için çalışıyor, aynı durumlarda şimdi yüksekliği
kesiyor

1
Şimdiye kadar bulduğum bunu başarmak için en iyi çözüm bu.
fragon

1
Çözümün yerleşik olması beni gerçekten çok kazanıyor.
Daniel Handojo

3
Yakınlaştırma eklemek için aşağıdakileri ekleyin: webview.getSettings (). SetBuiltInZoomControls (true); webview.getSettings (). setDisplayZoomControls (false);
Andrew

34

Arkadaşlar,

Sizden çok fazla önemli ve harika bilgi buldum. Ama benim için işe yarayan tek yol şuydu:

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

Şirketten gelen cihazlar nedeniyle Android 2.1 üzerinde çalışıyorum. Ama her birinden bilgi bölümünü kullanarak sorunumu çözdüm.

Teşekkürler!


Daha sonra yakınlaştırma artık çalışmıyor. Bu sorunu olan tek kişi ben miyim?
test

@testing herhangi bir çözüm buldunuz mu?
Anshul Tyagi

@AnshulTyagi: Hayır, yapmadım. Benim için bir test projesiydi çünkü bu konuyu daha fazla araştırmadım. Bir şey bulursan bana haber ver!
test

@AnshulTyagi: Web sayfaları için bu yaklaşım benim için çalışıyor. Görüntüler için farklı bir şey kullanmalıyım ...
test

31

Bu ayarlar benim için çalıştı:

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

setInitialScale (1) eksikti.

Dokümantasyon söylüyor rağmen 0 eğer tüm yol uzaklaşır setUseWideViewPort ayarlandığında gerçek ama 0 benim için çalışmalarını vermedi ve ben ayarlamak zorunda 1 .


1
İlk ölçeği belirlemiyordum ve bu benim için yıllarca işe yaradı. (sadece genel bakış modunu ve görüntü alanını ayarlıyordum). Ancak yeni karşılaştığım yeni bir cihaz, sayfa yenilenene kadar yakınlaştırmaya başlamış gibi görünüyordu. İlk ölçeği ayarlamak bunu benim için düzeltti.
IAmGroot


15

Tek yapmanız gereken basitçe

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

13

Bunlar benim için çalışıyor ve Web Görünümü'nü ekran genişliğine sığdırıyor:

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

Tutulma Web görünümünde yukarıdaki tavsiyeler ve Beyaz çizgi teşekkürler


3
Görünüşe göre SINGLE_COLUMN artık kullanımdan kaldırıldı developer.android.com/reference/android/webkit/…
Alexander Abramov

11

Bu kodu kullandığımda aynı problemi yaşıyorum

webview.setWebViewClient(new WebViewClient() {
}

belki de onu kodunuzdan kaldırmalısınız
ve web görünümünüz için aşağıya 3 mod eklemeyi unutmayın

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

bu, boyutu ekran boyutuna göre düzeltir


2
@shahzainali web görünümünüzü yakınlaştırabilir misiniz?
Anshul Tyagi

@AnshulTyagi Hayır yakınlaştırmıyor.
shahzain ali

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

Metin boyutu .setLoadWithOverViewMode ve .setUseWideViewPort tarafından gerçekten küçük olarak ayarlandığından, bu benim için harika çalışıyor.


6

Html dizesinde video vardı ve web görünümünün genişliği ekran genişliğinden daha büyüktü ve bu benim için çalışıyor.

Bu satırları HTML dizesine ekleyin.

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

Yukarıdaki kodu HTML dizesine ekledikten sonraki sonuç:

<!DOCTYPE html>
<html>

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


</html>

5

Bu durumda web görünümünüzde HTML kullanmanız gerekir. Bunu aşağıdaki kodu kullanarak çözdüm

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

% yerine px ot vh kullanmak daha iyidir sanırım. iframe'lerde yön değişikliklerinde bazı hatalar var
Siarhei

4

Display.getWidth () 'den bu yana danh32 tarafından yanıtta değişiklik yapılması; artık kullanımdan kaldırıldı.

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

Sonra kullan

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

Ölçeğin <% 1 veya% 100 olması gerektiğini hesapladım, bu yüzden oranı elde etmek için genişliğimi PIC_WIDTH ile karşılaştırdım. Bundan daha fazlası, bazı dolgu maddelerini de çıkardım.
Abhinav Saxena

4

Bu bir XML problemi gibi görünüyor. Web Görünümünüzü içeren XML belgesini açın. Üst kısımdaki dolgu kodunu silin.

Ardından düzende şunu ekleyin:

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

Web Görünümünde şunu ekleyin:

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

Bu, Web Görünümü'nü cihaz ekranına sığdırır.


bu benim zamanımı kurtarıyor.
Kabkee

2
fill_parent güncel değil, match_parent kullanın.
Trevor Hart

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

işe yarayacak, ancak aşağıdaki gibi bir şeyi kaldırmayı unutmayın:

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

html dosyasında varsa veya user-scalable = yes'i değiştirin, aksi takdirde olmaz.


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

1
getRight ve getLeft benim için her zaman 0 değerini döndürür
yrazlik

2

Bu, emülatörü web sayfasına göre ayarlamanıza yardımcı olacaktır:

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

Başlangıç ​​ölçeğini yukarıda gösterildiği gibi yüzde olarak ayarlayabilirsiniz.


2

Görüntüleme nesnesinin getWidth yöntemi kullanımdan kaldırılmıştır. Kullanılabilir olduğunda Web Görünümü boyutunu almak için onSizeChanged öğesini geçersiz kılın.

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

Nasıl alabilirim WEB_PAGE_WIDTH?
test

Bazı sabit genişlikteki içeriği ekrana sığacak şekilde ölçeklemeye çalışıyorsanız, içeriğinizin ne kadar geniş olduğunu önceden bilmelisiniz. bu mantıklı mı?
SharkAlley

Tamam, bu resimler için çalışmalı. Ancak (duyarlı olabilen) web sayfaları için, örneğin herhangi bir genişlik> 320 piksel olabilir.
test


1

@ danh32'nin cevabına dayalı, kullanımdan kaldırılmış yöntemleri kullanmayan güncellenmiş bir sürümü burada bulabilirsiniz:

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

aynı şekilde kullanılacak:

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

0

Referans için bu, @ danh32'nin çözümünün bir Kotlin uygulamasıdır:

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

Benim durumumda, genişlik üç görüntü tarafından 300 piksel olarak belirlendi, bu yüzden:

webview.setInitialScale(getWebviewScale(300))

Bu yazıyı bulmam saatler sürdü. Teşekkürler!


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

Lütfen olumsuz oylar nedeniyle aynı içeriğe sahip iki yanıt göndermeyin.
techydesigner

Ve lütfen biraz çaba harcayarak kodunuzu biçimlendirin! Neden sağa bu kadar girintili yaptın? Beyaz alanı silmek için çok mu zamanınız var?
Massimiliano Kraus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.