본문 바로가기

Program/Android

Android - WebView & JavaScript

** 개인적 메모입니다. 태클 사절 **

안드로이드 java source

===================================================================================================


package com.example.webview;


import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.os.Vibrator;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.view.Window;

import android.view.View.OnClickListener;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Button;


import com.example.R;


 public class WebViewDemo extends Activity {

 

 WebView webview;

  

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        

        //Windows 의 속성 변경은 꼭 setContentView 이전에 해주어야 한다.

        //설정사항 - no title, full screen, 가로/세로 고정, custom title 

        //내장 progress 지원(title 바에 위치됨)

        requestWindowFeature(Window.FEATURE_PROGRESS);

        

        setContentView(R.layout.webview_demo_main);

        

        Button bt = (Button)findViewById(R.id.bt);

        webview = (WebView)findViewById(R.id.webview);

        

        bt.setOnClickListener(new OnClickListener() {


            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                // javascript function call

                webview.loadUrl("javascript:fromApp();");

            }

        });

        

        WebSettings settings = webview.getSettings();

        settings.setJavaScriptEnabled(true);

        settings.setBuiltInZoomControls(true);

        // flash 지원하려면

        //settings.setPluginsEnabled(true);

        

        // javascript에게 공개할 클래스와 그 클래스의 공개명칭

        webview.addJavascriptInterface(new JavascriptInterfaceTest(),"android");

        

        webview.loadUrl("http://");

        

        //webview의 유저 이벤트

        webview.setWebViewClient(new WebViewClient(){

         

         // 유저가 클릭하는 순간의 링크 이벤트, 사용자가 추가적인 데이터를 넣으려 할 때도 쓰임

         @Override

         public boolean shouldOverrideUrlLoading(WebView view, String url) {

          // TODO Auto-generated method stub

          Log.d("maluchi", "url: "+url);

          view.loadUrl("http://m.naver.com");

          return true;

          //return super.shouldOverrideUrlLoading(view, url);

         }

        });

        

        webview.setWebChromeClient(new MyWebChromeClient());

    }

   

    

   

    //key event 처리, onKeyUp/Down

    //만약 back key만 처리하겠다면 onBackPressed 메서드를 이용할 수 있다.

    //하지만 둘을 같이 선언 할 수 없다.

    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

     // TODO Auto-generated method stub

     if(keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack())

     {

      webview.goBack();

      return true;

     }

     return super.onKeyDown(keyCode, event);

    }

    

    // javascript에서는 java 에서 공개한 객체의 메서드만 호출한다.

    // javascript에게 공개할 클래스

    public class JavascriptInterfaceTest{

     public void vibration()

     {

      Vibrator vib = (Vibrator)WebViewDemo.this.getSystemService(Context.VIBRATOR_SERVICE);

      vib.vibrate(500);

      //vib.vibrate(new long[]{1000,1000,1000}, 0);

     }

    }

    

    // 브라우저 자체의 이벤트 핸들러 클래스

    public class MyWebChromeClient extends WebChromeClient

    {

     // 페이지 로딩 상태 변화시 호출, 수시로 호출된다.

     @Override

     public void onProgressChanged(WebView view, int newProgress) {

      // TODO Auto-generated method stub

      // 모든 Activity는 자체 Progress를 가지고 있다.

      WebViewDemo.this.setProgress(newProgress*100); // 값의 차이가 100차이라서 곱함

      

      //super.onProgressChanged(view, newProgress);

     }

     

    }

}



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" 

    android:layout_weight="1"

    />

    <Button  

 android:id="@+id/bt"

    android:layout_width="fill_parent" 

    android:layout_height="wrap_content" 

    android:text="Call JavaScript"

    />

</LinearLayout>

 



test html

===================================================================================================


<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=euc-kr">

<script language="javascript">

 function vibration(){

  // javascript->java method

  window.android.vibration();

 }


 function fromApp()

 {

  // java method -> javascript

  alert('call to javascript');

 }

 

</script>

<title>안드로이드 데모 - 자바스크립트 호출페이지</title>

</head>

<body>

<h2>WebView Test</h2>

<br />

<br />

<a href="http://www.google.com">go to google</a>

<br />

<br />

<input type="button" value="vibrate" onClick="javascript:vibration();" />

</body>

</html> 

'Program > Android' 카테고리의 다른 글

Android - 안드로이드의 파일 입출력 경로 얻기(커니님의 글)  (0) 2011.12.06
Android - Activity Life Cycle  (0) 2011.12.05
Task or Stack  (1) 2011.11.07
굴욕...BaseLayout Custom  (6) 2011.10.29
동적 뷰 추가하기  (2) 2011.10.29