Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Android WebView에 ZoomControls 사용하기

안드로이드앱에서 WebView를 사용할 일이 있어서(아직 책은 기본예제만 하고 있지만) 찾은 김에 정리해 봅니다.  WebView with ZoomControls in Android의 내용을 다시 정리(?? 사실은 그대로 옮겨적기만)한 내용입니다.  이 예제는 줌컨트롤을 포함한 웹뷰를 생성하는 예제입니다. 줌 컨트롤은 안드로이드에서 웹브라우저등을 사용할때 화면상에 +/-버튼이 나오는 것을 의미합니다.


<uses-permission android:name="android.permission.INTERNET"></uses-permission>

AndroidManifest.xml 파일에 위의 내용을 추가합니다. 웹뷰를 사용하기 위해서는 인터넷에 대한 접근권한이 필요합니다. 이 부분이 추가되지 않으면 웹뷰를 추가하여도 인터넷이 연결안된 것처럼 페이지표시할 수 없음으로 나타나게 됩니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<WebView  
    android:id="@+id/webView"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    />
</LinearLayout>

layout/main.xml파일입니다. 웹뷰만 표시할 것이므로 간단히 WebView만 추가했습니다.


package kr.ne.outsider;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class exwebview extends Activity {
    private WebView myWebView;
    final private String DEFAULT_URL = "http://blog.outsider.ne.kr";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myWebView = (WebView)this.findViewById(R.id.webView);
        
        this.myWebView.loadUrl(DEFAULT_URL);
    }
}

웹뷰만 띄우는 것은 간단합니다. 웹뷰의 객체를 가져오고 WebView의 loadUrl 함수를 이용해서 페이지를 호출합니다.

실행된 WebView 예제화면

앱을 실행하면 정상적으로 웹뷰내에 지정한 웹페이지가 나타나게 됩니다.



package kr.ne.outsider;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.FrameLayout;

public class exwebview extends Activity {
    private WebView myWebView;
    final private String DEFAULT_URL = "http://blog.outsider.ne.kr";
    // new added
    private static final FrameLayout.LayoutParams ZOOM_PARAMS = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            Gravity.BOTTOM
        );
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myWebView = (WebView)this.findViewById(R.id.webView);
        
        // new added
        FrameLayout mContentView = (FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content);
        final View zoom = this.myWebView.getZoomControls();
        mContentView.addView(zoom, ZOOM_PARAMS);
        zoom.setVisibility(View.GONE);
        
        this.myWebView.loadUrl(DEFAULT_URL);
    }
}


줌컨트롤을 추가했습니다.
28번째 라인은 최상위(top-level) 윈도우의 DecorView를 가져옵니다.
29번째 라인은 WebView객체의 줌컨트롤을 얻어옵니다.
30번째 라인에서 최상위(top-level) 윈도우에 줌컨트롤을 추가합니다. 참고한 포스팅을 쓴 분이 BroswerActivity의 코드에서 추출해 낸 코드라고 합니다.
31번째 출은 시작할때 줌컨트롤을 숨기도록 합니다. 이는 사용자가 화면을 스크롤할때만 줌컨트롤이 나타나도록 하기 위해서입니다.

실행된 WebView 예제화면

평소엔 안보이다가 화면을 스크롤하면 줌컨트롤이 하단에 나타나고 +/-로 화면을 확대축소 할 수 있습니다. 제 생각에는 멀티터치를 이용한 줌이 기본으로 되어야 할 것 같은데 이유는 모르겠지만 멀티터치를 이용한 줌이 동작하지 않습니다. ㅠ..ㅠ

이렇게 웹뷰를 추가하게 되면 웹페이지의 URL을 클릭시에 웹뷰내에서 이동하지 않고 내장 브라우저가 호출되면서 내장 브라우저에서 링크된 페이지가 열리게 됩니다.


package kr.ne.outsider;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class exwebview extends Activity {
    private WebView myWebView;
    final private String DEFAULT_URL = "http://blog.outsider.ne.kr";
    private static final FrameLayout.LayoutParams ZOOM_PARAMS = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            Gravity.BOTTOM
        );
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myWebView = (WebView)this.findViewById(R.id.webView);
        
        FrameLayout mContentView = (FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content);
        final View zoom = this.myWebView.getZoomControls();
        mContentView.addView(zoom, ZOOM_PARAMS);
        zoom.setVisibility(View.GONE);
        
        // new added
        myWebView.setWebViewClient(new Callback());
        
        this.myWebView.loadUrl(DEFAULT_URL);
    }
    
    // new added
    private class Callback extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return(true);
        }
    }
}

웹페이지가 링크내에서 열리도록 하기 위해서 WebView객체에 새로운 WebViewClient객체를 추가했습니다. Callback에서  shouldOverrideUrlLoading메서드를 오버라이드해서 현재의 webview에서 다시 loadUrl을 하도록 처리했습니다. 이제 link를 클릭해도 웹뷰내에서 이동하게 됩니다.
2010/05/03 02:32 2010/05/03 02:32