Android Webview-웹 페이지가 기기 화면에 맞아야합니다.


103

장치 화면 크기에 따라 웹 페이지에 맞게 다음을 시도했습니다.

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 2010 년

1
아, 그 상수를 놓쳤습니다. 미안합니다. 실제 웹 페이지의 너비를 어떻게 얻을 수 있는지 잘 모르겠습니다.
danh32 2010 년

54
여기서 PIC_WIDTH는 무엇입니까?
Paresh Mayani 2011 년

4
PIC_WIDTH는 자산 폴더에서 하나의 이미지 만 표시했기 때문에 미리 알고있는 상수였습니다. 위에서 말했듯이 실제 웹 페이지의 너비를 어떻게 얻을 수 있는지 모르겠습니다.
danh32

1
내가 PIC_WIDTH = 360 사용 @MaheshwarLigade
니콜라스 잉

292

이것을 사용할 수 있습니다

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

이것은 화면 크기에 따라 크기를 수정합니다.


4
이렇게하면 화면에 닿지 만 더 이상 확대 / 축소 할 수 없습니다. 이 문제가 개선 될 수 있습니까?, IOS에서 가능하다는 것을 알고 있습니다.
AlexAndro 2011 년

1
이 설정은 나에게 적합하지만 너비에만 적용됩니다. 같은 경우에는 이제 높이가 잘
립니다

1
이것은 내가 지금까지 찾은 이것을 달성하는 가장 좋은 솔루션입니다.
fragon 2015

1
솔루션이 내장되어 있다는 사실이 정말 마음에 듭니다.
다니엘 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 : 아니,하지 않았다. 저에게 테스트 프로젝트 였기 때문에 더 이상 조사하지 않았습니다. 뭔가 찾으면 알려주세요!
테스트

@AnshulTyagi : 웹 페이지의 경우이 접근 방식 이 저에게 효과적 입니다. 이미지의 나는 뭔가 다른를 사용할 필요가 ...
테스트

31

이 설정은 저에게 효과적이었습니다.

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

내 시도에서 setInitialScale (1) 이 누락되었습니다.

문서에 따르면 setUseWideViewPorttrue 로 설정되어 있으면 0 이 완전히 축소 되지만 0 이 작동하지 않아 1 을 설정해야했습니다 .


1
나는 초기 규모를 설정하지 않았고 수년간 저에게 효과적이었습니다. (나는 단지 오버뷰 모드와 뷰포트를 설정하고 있었다). 그러나 Ive가 발견 한 새로운 장치는 페이지가 새로 고쳐질 때까지 확대되기 시작하는 것처럼 보였습니다. 초기 스케일을 설정하면이 문제가 해결되었습니다.
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);  

이클립스 웹보기에서 위의 조언과 화이트 라인 감사합니다.


3
SINGLE_COLUMN 지금은 사용되지 않습니다 보인다 developer.android.com/reference/android/webkit/...
알렉산더 아브라모프을

11

이 코드를 사용할 때도 같은 문제가 있습니다.

webview.setWebViewClient(new WebViewClient() {
}

그래서 당신은 당신의 코드에서 그것을 제거 해야 수도 있습니다
그리고 당신의 webview에 대해 아래 3 가지 모드를 추가하는 것을 잊지 마십시오

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

이것은 화면 크기에 따라 크기를 수정합니다.


2
@shahzainali 웹뷰를 확대 할 수 있습니까?
Anshul Tyagi

@AnshulTyagi 아니 그것은 확대하지 않습니다.
shahzain 알리

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

이 경우 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

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

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
int PIC_WIDTH= webView.getRight()-webView.getLeft();

1
getRight와 메쏘드 getLeft는 항상 나를 위해 0을 반환
yrazlik

2

웹 페이지에 따라 에뮬레이터를 조정하는 데 도움이됩니다.

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

위와 같이 초기 비율을 백분율로 설정할 수 있습니다.


2

Display 객체의 getWidth 메소드는 더 이상 사용되지 않습니다. WebView를 사용할 수있게되면 크기를 가져 오려면 onSizeChanged를 재정의합니다.

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

OK 이것은 이미지에 대해 작동합니다. 그러나 웹 페이지 (반응 형일 수 있음)의 경우 너비가 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);

다운 투표를 이유로 동일한 내용으로 두 개의 답변을 게시하지 마십시오.
techydesigner

그리고 약간의 노력을 들여 코드를 포맷하십시오! 왜 그렇게 오른쪽으로 들여 쓰기를 했나요? 공백을 삭제하는 데 너무 많은 시간이 걸리나요?
Massimiliano Kraus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.