본문 바로가기

모바일앱/안드로이드

WebView 활용

출처: http://blog.naver.com/vhahrtkd/90171455819


package kr.or.ddit.exweb;

 

import android.os.Bundle;

import android.app.Activity;

import android.graphics.Bitmap;

import android.util.Log;

import android.view.Menu;

import android.webkit.JsResult;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Toast;

 

public class ExWebActivity extends Activity {

 

 private WebView wv;

 

 @Override

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

 

  wv = new WebView(this); // 웹 브라우저 역할을 하는 웹뷰 생성

  setContentView(wv);      // 액티비티 화면(윈도우)에 웹뷰 배치

 

 

  WebSettings ws = wv.getSettings();    //웹뷰의 브라우저 관련 설정을 설정 객체를 통해서

  ws.setJavaScriptEnabled(true);          // 웹뷰 내의 웹문서가 자바스크립트 사용 가능

 

  // alert, confirm, prompt등 브라우저 UI와 관련된 작업을 처리하는 객체 

  //wv.setWebChromeClient(new WebChromeClient());

  wv.setWebChromeClient(new MyWebChromeClient());

 

  //웹뷰 내의 링크 클릭시 페이지 이동 등 컨텐츠 렌더링과 관련된 작업을 처리하는 객체

  //wv.setWebViewClient(new WebViewClient());

  wv.setWebViewClient(new MyWebViewClient());

 

  wv.loadUrl("file:///android_asset/index.html");   // 웹뷰에 웹문서 로드

 

  // wv.addJavascriptInterface(object, name)

  // 웹 뷰 wv 내의 웹 문서의 자바스크립트에서

  // "window.name.메서드명()" 과 같은 형태로

  // Object 의 메서드들을 실행 시킬 수 있게 된다.

 

  // MyInterface 객체의 메서드들을 실행시킬수 있게 된다.

  wv.addJavascriptInterface(new MyInterface(), "java");

 

 }



 // JavaScript Object ---------------------------------------------------------

 class MyInterface{

  private int count =0;

 

  // 자바스크립트로부터 인자를 받을 수도 있고,

  // 결과를 자바스크립트로 리턴(반환) 할 수 있다.

  public String callJava(String str){

   return str + "fromJAVA" + (++count);

  }

 

  public void click(){

   Log.d("DDIT", "Java 코드의 Click 메서드 실행");

  

   // 웹 뷰 내의 현재 웹문서에 존재하는 자바스크립트 함수 실행.

   wv.loadUrl("javascript:changeImg()");

  

  }

 }

 

 // WebViewClient 내부 클래스 -----------------------------------------------------

 class MyWebViewClient extends WebViewClient{

 

  // 이 웹뷰 클라이언트와 연결된 웹뷰가 웹문서 로드를 시작할 때 실행

  @Override

  public void onPageStarted(WebView view, String url, Bitmap favicon) {

   Log.d("DDIT", "onPageStarted : " + url);

   super.onPageStarted(view, url, favicon);

  }

 

  // 이 웹뷰 클라이언트와 연결된 웹뷰가 웹문서 로드가 완료되면 실행

  @Override

  public void onPageFinished(WebView view, String url) {

   Log.d("DDIT", "onPageFinished : " + url);

   super.onPageFinished(view, url);

  }

 

  // 웹 뷰 내에서 링크를 클릭하거나 포워딩으로 페이지 이동이 일어날 때 실행되는 메서드

  @Override

  public boolean shouldOverrideUrlLoading(WebView view, String url) {

   if(url.startsWith("http://m.naver.com")){

    view.loadUrl("http://m.daum.net");

    Toast.makeText(view.getContext(), "No,No,No",

       Toast.LENGTH_SHORT).show();

    return true;

   }else if(url.startsWith("myapp://")) {

    Toast.makeText(view.getContext(),

       url.substring(url.lastIndexOf("/")),

       Toast.LENGTH_SHORT).show();

    return true;

   }

  

   return super.shouldOverrideUrlLoading(view, url);

  }

 

 }

 

 // WebChormeClient 내부 클래스 --------------------------------------------------

 class MyWebChromeClient extends WebChromeClient{

  // 이 웹크롬클라이언트와 연결된 웹뷰 내에서 alert()이 호출되면 실행

  // alert이 호출된 웹뷰와 현재 url, alert에 전달된 메시지 문자열,

  // alert 결과를 설정할 수 있는 JsResult 객체가 인자로 전달된다.

  @Override

  public boolean onJsAlert(WebView view, String url, String message,

    JsResult result) {

   Toast.makeText(view.getContext(), message, Toast.LENGTH_SHORT).show();

   result.confirm(); // alert 창에서 사용자가 확인을 누른 것처럼 조작.

   //return super.onJsAlert(view, url, message, result);

   return true;

  }

 

 

  // 이 웹크롬 클라이언트와 연결된 웹뷰가 웹문서를 로드할 때 현재 몇 퍼센트로

  // 로드되었는지가 인자로 전달되면서 지속적으로 실행.

  @Override

  public void onProgressChanged(WebView view, int newProgress) {

   // 안드로이드에서 sysout logcat으로 출력된다

  System.out.println("onProgressChanged : " + newProgress);

  // 안드로이드에서 sysout 대신  Log.xx 메서드로 디버그 메시지 출력

  // Log.x("태그문자열", "메시지문자열");

  // Log 메서드는 기능은 동일하며

  // 각각 d(debug), e(error), i(information, v(verbose), w(warning)출력용

  Log.d("DDIT","onProgressChanged : " + newProgress);

  

   super.onProgressChanged(view, newProgress);

  }

 

 }

}


--AndroidManifest.xml------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="kr.or.ddit.exweb"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="17" />

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

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="kr.or.ddit.exweb.ExWebActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

 

</manifest>

---------------------------------------------------------------------------------