'WebView'에 해당되는 글 2건

  1. 2010.07.16 WebView 6
  2. 2010.07.06 Using WebView 3
Android/App개발2010. 7. 16. 15:42

웹페이지를 표시하는 뷰이다.

상속구조는 아래와 같다.

   ↳ android.view.View 
         ↳ android.webkit.WebView

웹브라우저에서 하는 역할을 모두 할 수 있으며 액티비티내에서 화면의 일부로 온라인컨텐츠를 표시할수 있다.
WebKin render engine을 사용하며 이전페이지, 다음페이지, 확대/축소, 텍스트검색등의 기능을 포함한다.

zoom기능을 활성화하려면 WebSettings.setBuiltInZoomControls(boolean)을 사용하라.

액티비티에서 인터넷을 억세스하고 웹페이지를 WebView에 표시하려면 아래 퍼미션을 매니페스트 파일에 추가하라.

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

기본적인 사용법
기본적으로 WebView는 브라우져와 유사한 위젯을 제공하지는 않는다. 자바스크립트는 비활성화되어 있으며 웹페이지에러는 무시된다. 그냥 UI의 일부로 HTML을 표시하고자 한다면 이정도면 충분하다. 만일 full-blown 웹브라우져를 원한다면 WebView를 이용하는것보다 그냥 인텐트를 날려서 브라우져에서 표시하고자 할것이다. 아래와 같이...

   Uri uri = Uri.parse("http://www.example.com");
   
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
   startActivity
(intent);
 
액티비티에서 WebView를 제공하고자 한다면 layout에 <WebView>를 추가하거나 onCreate()에서 액티비티자체를 WebView로 지정하면 된다.
   WebView webview = new WebView(this);
   setContentView
(webview);
 
이어서 원하는 웹페이지를 로드한다.

// Simplest usage: note that an exception will NOT be thrown
 
// if there is an error loading this page (see below).
 webview
.loadUrl("http://slashdot.org/");

 
// OR, you can also load from an HTML string:
 
String summary = "<html><body>You scored <b>192</b> points.</body></html>";
 webview
.loadData(summary, "text/html", "utf-8");
 
// ... although note that there are restrictions on what this HTML can do.
 
// See the JavaDocs for loadData() and loadDataWithBaseURL() for more info.

WebView는 원하는 동작을 구현하기 위해 몇가지 수정가능한 방법을 제공한다.
 - WebChromeClient의 subclass를 생성하고 설정한다. 이 클래스는 브라우져UI에서 어떤 동작이 발생하면 호출된다. 예를 들어 update과정이나 자바스크립트 경고같은 것들이 이 클래스로 전달된다.
 - WebViewClient의 서브클래스를 생성하고 설정한다. 콘텐츠의 렌더링과 연관된 동작이 발생하면 호출된다. 예를 들어 에러나 폼서브미션시(form submission)에 호출된다. shouldOverrideUrlLoading()함수를 통해 URL이 로드되기전에 원하는 작업을 할 수도 있다.
 - WebSettings의 변경가능, setJavaScriptEnabled()로 자바스크립트를 활성화할 수 있다.
 - JavaScript-to-Java 인터페이스를 추가할 수 있다. addJavascriptInterface(Object, String)메소드로 가능하다. 이 함수는 자바오브젝트를 WebView에 바인드할 수 있다. 이렇게 하여 웹페이지의 자바스크립트를 제어할 수 있다.

아래 좀더 복잡한 예제가 있다, 에러핸들링의 표시, 셋팅, 진행상태 통지등의 예를 볼수 있다.

// Let's display the progress in the activity title bar, like the
 
// browser app does.
 getWindow
().requestFeature(Window.FEATURE_PROGRESS); // 타이틀바에 진행상태 아이콘표시모드로 변경한다.

 webview
.getSettings().setJavaScriptEnabled(true); // 자바스크립트를 활성화한다.

 
final Activity activity = this;
 webview
.setWebChromeClient(new WebChromeClient() { // WebChromeClient를 설정하고 진행상태 변동상태를 화면에 반영한다.
   
public void onProgressChanged(WebView view, int progress) {
     
// Activities and WebViews measure progress with different scales.
     
// The progress meter will automatically disappear when we reach 100%
     activity
.setProgress(progress * 1000);
   
}
 
});

 webview
.setWebViewClient(new WebViewClient() { // WebViewClient를 설정하여 에러발생시 토스트로 표시한다.
   
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
     
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
   
}
 
});

 webview
.loadUrl("http://slashdot.org/"); // 원하는 웹페이지를 연다.
 
쿠키와 윈도우관리
보안상의 이유로 당신의 애플리케이션은 자체 캐시와 쿠키 등의 저장소들을 가지고 있다. 이것은 브라우져애플리케이션의 데이터와 공유되지 않는다. 쿠키의 경우 스래드로 분리되어 관리된다. 그래서 UI thread에 의해 블럭되지 않는다. 애플리케이션에서 쿠리정보를 참조하고 싶다면 CookieSyncManager를 사용하라.

기본적으로 HTML에서 새로운 창에 여는기능은 무시된다. 이는 자바스크립트나 링크의 대상의 속성에의해 가능해진다. WebChromeClient를 수정하여 여러개의 윈도우로 페이지를 여는것을 당신 마음대로 변경할 수 있다.

액티비티의 기본동작은 configuration이 변경되면 destroy되었다가 다시 create되는것이다. 이 경우 WebView는 웹페이지를 다시 로딩하게 된다. 이게 싫다면 orientation과 keyboardHidden값을 변경하면 다시로드하지 않고 처리된다.

자주 사용된느 WebView관련 함수들
addJavascriptInterface() 자바스크립트의 자바 객체 접근 허용

createSnapshot() 현 페이지의 스크린샷 생성

getSettings() 설정을 조정하는  WebSettings 객체 반환 

loadData() 브라우저에 주어진 문자열 데이터 로딩

loadDataWithBaseURL() 기준 URL을 사용해 주어진 데이터 로딩

loadUrl() 주어진 URL을 사용해 웹페이지 로딩

setDownloadListener() 사용자가 .zip이나 .apk 파일을 다운받는 경우 등의 다운로드 이벤트의 콜백 등록

setWebChromeClient() 제목이나 진행률 표시줄을 업데이트하거나 자바스크립트 대화상자를 여등 등, WebView 영역밖에서 실행되는 이벤트의 콜백을 등록

setWebViewClient() 리소스 로딩하기, 키 눌림, 인증 요청 등의 이벤트를 방해하도록 애플리케이션이 브라우저에 걸림돌을 설정함.

stopLoading() 현재 페이지 로딩 멈추기







Posted by 삼스
Android/App개발2010. 7. 6. 22:17

원문 : http://developer.android.com/resources/articles/using-webviews.html

 

링크 : http://silence2.tistory.com/entry/Using-WebViews


번역 : 이상훈 (calm1979@gmail.com)

2010년 6월 30일

 

WebViewDemo는 어플리케이션에 웹 컨텐츠를 붙일 수 있는 방법을 보여주는 간단한 어플리케이션이다. 이것은 apps-for-android 프로젝트에서 찾을 수 있다. 이 어플리케이션은 액티비티 내에 WebView를 붙일 수 있는 방법과 어플리케이션과 웹 컨텐츠 사이에 서로 통신할 수 있는 방법을 보여준다.

 

WebView는 브라우저와 동일한 렌더링 엔진과 자바 스크립트 엔진을 사용하지만, 당신의 어플리케이션의 제어하에 동작한다. WebView는 전체 화면으로 동작할 수도 있고, 다른 View들과 섞여서 동작할 수도 있다. WebView의 컨텐츠는 어디서든지 올 수 있다. WebView는 웹에서 컨텐츠를 다운로드 하거나, 당신의 assets 디렉토리 내에 저장된 로컬 파일에서 컨텐츠를 얻을 수도 있다. 심지어 어플리케이션 코드 상에서 동적으로 생성된 컨텐츠를 사용할 수도 있다. 이 예제에서는 demo.html 이라는 로컬 파일을 표시한다.

 

이 어플리케이션은 많은 것을 하지는 않는다: 당신이 안드로이드를 클릭하면 팔을 들어줄 뿐이다.


물론 이것은 간단한 자바 스크립트로 처리할 수 있다. 하지만, WebViewDemo는 WebView의 매우 강력한 두 가지 기능을 알려주기 위해 약간 복잡한 방법을 사용했다.

 

첫 째, WebView 내에 돌고 있는 자바 스크립트에서 액티비티의 코드를 호출할 수 있다. 당신은 이런 것을 자바 스크립트가 새로운 액티비티를 시작하는 액션을 발생시키거나, 데이터베이스나 ContentProvider에서 데이터를 얻어내는 경우 등에 사용할 수 있다. 이를 위한 API는 매우 간단하다: WebView의 addJavascriptInterface()만 호출하면 된다. 자바 스크립트에 노출시킬 메소드를 가진 객체와 자바 스크립트에서 호출할 때 사용할 이름을 넘겨주면 된다. 정확한 문법은 WebViewDemo.java에서 확인할 수 있다. 여기에서는 자바 스크립트에서 "window.demo"로 호출해서 사용될 DemoJavascriptInterface 객체를 만들었다.

 

둘 째, 액티비티에서 자바 스크립트 메소드를 호출할 수 있다. 이것은 모두 loadUrl 메소드를 통해 적절한 자바 스크립트를 호출 해야한다.

1 mWebView.loadUrl("javascript:wave()");


WebViewDemo 는 두 가지 기술을 사용하고 있다: 당신이 안드로이드를 클릭하면, 액티비티로 호출을 하고 다시 자바 스크립트를 호출한다. WebViews는 매우 강력하고, 어플리케이션을 만드는데 충분히 도움이될 만한 툴이다. - 특히 많은 양의 HTML 컨텐츠를 가지고 있는 경우에 도움이 될 것 이다. 마침, 우리는 우리가 만들고 있는 어플리케이션의 일부에서 정확히 이 방식을 사용했었다.


Posted by 삼스