YesYo.com MintState Forums
뒤로    YesYo.com MintState BBS > Tech > Android
검색
멤버이름    오토
비밀번호 
 

Android <-> WebView 간 호출하기

페이지 정보

작성자 MintState 댓글 0건 조회 11,820회 작성일 11-04-21 21:04

본문

Android <-> WebView 간 호출하기

Android쪽
public class LocalBrowser extends Activity {

	private static final String TAG = "LocalBrowser";
	private final Handler handler = new Handler();
	private WebView webView;
	private TextView textView;
	private Button button;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 화면에서 안드로이드 컨트롤 찾기
		webView = (WebView) findViewById(R.id.web_view);
		textView = (TextView) findViewById(R.id.text_view);
		button = (Button) findViewById(R.id.button);

		// 임베딩된 브라우저-WebView-에 자바스크립트 활성화하기
		webView.getSettings().setJavaScriptEnabled(true);

		// 자바 객체-AndroidBridge-를 브라우저의 자바 스크립트에 노출시키기
		// 객체, 노출할 DOM명칭
		webView.addJavascriptInterface(new AndroidBridge(), "android");

		// 임의의 WebChromeClient 객체를 생성하여 WebView에 등록.
		// 여기의 Chrome은 브라우저 창 주의를 정리하는 모든 작업을 일컬음. 즉, 브라우저 처리을 할 클라이언트를 등록
		webView.setWebChromeClient(new WebChromeClient() {

		@Override
		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
			//return super.onJsAlert(view, url, message, result);
			Log.d(TAG, "onJsAlert(" + view + ", " + url + ", " + message + ", " + result + ")");

			Toast.makeText(LocalBrowser.this, message, 3000).show();

			result.confirm(); // 결과 처리됨
			return true; // 여기서 처리했으므로 true 반환
		}
	});

        // 로컬 assets에서 웹 페이지 로딩하기
        webView.loadUrl("file:///android_asset/index.html");

        button.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Log.d(TAG, "onClick(" + v + ")");

				// 자바스크립트 호출
				webView.loadUrl("javascript:callJS('Hello from Android')");
			}
		});
	}


	/**
	* 자바 스크립트에 노출된 객체
	*
	*/
	private class AndroidBridge {
		public void callAndroid(final String arg) { // 반드시 final이어야 함

			handler.post(new Runnable() {

				@Override
				public void run() {
					Log.d(TAG, "callAndroid(" + arg + ")");

					textView.setText(arg);
				}
			});
		}
	}
}



WebView쪽
<html>
<head>
<script type="text/javascript">
function callJS(arg) {
	document.getElementById("replaceme").innerHTML = arg;
}
</script>
</head>
<body>
<h1>WebView</h1>
<p>
	<a href="#" onclick="window.alert('Alert from JavaScript');">Display JavaScript alert</a>
</p>
<p>
	<a href="#" onclick="window.andriod.callAndroid('Hello from Browser');"></a>
</p>
<p id="replaceme"></p>
</body>
</html>

addJavascriptInterface() 에서 설정한 DOM명칭 "android"로 WebView에서 호출가능하다.
- final 매개변수를 잘 사용하자. -> 메소드 내에서 변경하면 안되는 값(주소값)일 경우에 사용하면 유용할 듯


출처 : http://lonelycat.tistory.com/447

댓글목록

등록된 댓글이 없습니다.

Total 18건 1 페이지
게시물 검색
모바일 버전으로 보기
CopyRight ©2004 - 2024, YesYo.com MintState. ™