: 웹뷰를 사용해서 웹 페이지를 포함시켰을때, 웹페이지에서 안드로이드 애플리케이션의 메서드를 호출하거나, 안드로이드 애플리케이션에서 웹페이지의 자바스크립트를 호출하는 경우가 있다.
<html>
<script language="xxjavascript">
function changeFace() {
document.getElementById("face").src="face_angry.png";
}
</script>
<body>
<div style="width:120px; margin:0px auto; padding:10px; text-align:center; border:2px solid #202020;">
<a [안내]태그제한으로등록되지않습니다-xxonClick="window.sample.clickOnFace()"><img id="face" src="face_normal.png"/></a>
<br>
</div>
</body>
</html>
--> changeFace() 자바스크립트 함수는 안드로이드 애플리케이션에서 호출되는 함수이다.
--> window.sample.clickOnFace() 함수는 안드로이드 애플리케이션내에서 호출되는 clickOnFace() 메서드이다. window.sample.clickOnFace()의 sample 객체는 안드로이드 애플리케이션의 addxxJavaScriptInterface() 메서드이 파라미터로 전달된 'sample'이다.
package com.example.samplewebview;
import android.os.Bundle;
import android.os.Handler;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.xxOnClickListener;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
/**
* 웹뷰 사용 예
* : 웹뷰를 화면안에 넣어서 앱과 웹 사이에서 상호 할 수 있는 기능 예제
*
* @author hjs6877
*
*/
@SuppressLint("xxJavascriptInterface")
public class MainActivity extends Activity {
/**
* 웹뷰 객체
*/
private WebView webview;
/**
* 웹사이트 로딩 버튼
*/
private Button btnLoad;
/**
* 핸들러 객체
*/
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 웹뷰 객체 참조
webview = (WebView)findViewById(R.id.webview);
// 웹뷰 설정 정보
WebSettings webSettings = webview.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setxxJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webview.setWebChromeClient(new WebBrowserClient());
// 웹페이지에서 호출할 클래스와 객체 이름 정의
webview.addxxJavascriptInterface(new xxJavaScriptMethods(), "sample");
// assets 폴더에 있는 메인 페이지 로딩
webview.loadUrl("file:///android_asset/sample.html");
final EditText urlInput = (EditText)findViewById(R.id.url);
// 버튼 이벤트
btnLoad = (Button)findViewById(R.id.btnLoad);
btnLoad.setxxOnClickListener(new xxOnClickListener() {
@Override
public void xxonClick(View v) {
// 입력한 URL 페이지 로딩
webview.loadUrl(urlInput.getText().toString());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
final class xxJavaScriptMethods {
xxJavaScriptMethods()
{
}
// 웹 페이지에서 호출하는 메서드.
public void clickOnFace()
{
handler.post(new Runnable(){
@Override
public void run() {
btnLoad.setText("클릭후 열기");
// 웹 페이지의 자바스크립트 함수 호출.
webview.loadUrl("xxjavascript:changeFace()");
}
});
}
}
final class WebBrowserClient extends WebChromeClient {
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
result.confirm();
return true;
}
}
}