모바일/Android

Android <-> Webview 사이 데이터 통신하기

늘근이 2016. 5. 8. 09:12

WebView가 기본적으로 내장 브라우저 기능을 하지만,

자바스크립트를 이용해 데이터를 주고받음으로써 한몸처럼 행동할수가 있다.


WebView에 넣을 html을 이용한 버튼

<input type="button" value="test" onclick="showAndroid('Hello')" />


그리고 WebView에 넣을 자바스크립트

<!--Data from Javscript-->
<script type="text/javascript">
 
  function showAndroid(toast) {
    Android.showToast(toast);
  }
 
</script>


안드로이드에서도 클래스를 하나 만들어준다.


 import android.content.Context;
import android.webkit.JavascriptInterface;
import android.widget.Toast;

public class JavaScriptPasser {

Context mContext;

public JavaScriptPasser(Context c) {
mContext = c;
}

@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}

}


 어노테이션이 빠지면 동작이 안되는경우가 많다고 하니 조심 (sdk 17이상)


그리고 안드로이드에서 데이터를 넘겨주게끔 통신을 다음과 같이 설정한다.


 


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

webview.addJavascriptInterface(new JavaScriptPasser(this), "Android");


이렇게 되면 웹뷰에서도 버튼을 눌렀을때, showToast라는 메서드가 작동하게 된다.




다만 클릭을 하지말고 처음에 스크립트가 실행되었을때 객체를 넘기고 싶다면 다음과 같은 메서드를 쓸수있다.

 

public void passData(final WebView webView, final Data data) {
webView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
Gson gson = new Gson();
String dataString = gson.toJson(data);
view.loadUrl("javascript:initData('" + dataString +"')");
}
});
}

GSON은 JSON을 쉽게 해주는 라이브러리인데 굳이 현재 최신버전은 2.6이며 , 신기하게도 기본적으로 라이브러리가 안에 (2.3버전) 내장되어있기 때문에 그냥 냅다 쓰면 객체를 JSON객체로 변환해준다.

저렇게 웹뷰로 데이터를 넘길때 객체로는 넘겨지지 않으므로, .string으로 변하게 해서 해야한다.






'모바일 > Android' 카테고리의 다른 글

Mysql -> PHP -> JSON select시 코드  (0) 2016.05.10
mysql timestamp  (0) 2016.05.10
[CSS] justify-content  (0) 2016.04.30
opera 개발자 / microsoft code 정렬 단축키  (0) 2016.04.30
NVD3, 버그(?) 피해가기 (Uncaught TypeError)  (2) 2016.04.30